Android привязка данных не ссылается sh пользовательский интерфейс - PullRequest
0 голосов
/ 29 апреля 2020

У меня проблемы с привязкой данных Android.

У меня есть такой класс:

class AppConfig private constructor() : BaseObservable() {
    @Bindable
    var title = ""

    fun updateTitle(newTitle: String) {
        title = newTitle
        notifyPropertyChanged(BR.title)
    }
    ......
}

Когда приложение работает в фоновом режиме, приложение получает обновление pu sh и вызывается функция updateTitle. Затем я перехожу к своему приложению и вижу, что название изменилось. Тогда я пу sh другое обновление, название не меняется. Затем я нажимаю кнопку «Домой» и снова выводю приложение на передний план, название обновляется.

Я прочитал исходный код ViewDataBinding:

    protected void requestRebind() {
        if (mContainingBinding != null) {
            mContainingBinding.requestRebind();
        } else {
            synchronized (this) {
                if (mPendingRebind) {
                    return;
                }
                mPendingRebind = true;
            }
            if (mLifecycleOwner != null) {
                Lifecycle.State state = mLifecycleOwner.getLifecycle().getCurrentState();
                if (!state.isAtLeast(Lifecycle.State.STARTED)) {
                    return; // wait until lifecycle owner is started
                }
            }
            if (USE_CHOREOGRAPHER) {
                mChoreographer.postFrameCallback(mFrameCallback);
            } else {
                mUIThreadHandler.post(mRebindRunnable);
            }
        }
    }

Условие !state.isAtLeast(Lifecycle.State.STARTED) не выполнено в первый раз, и переменная mPendingRebind установлена ​​в значение true. Кажется, что только при запуске mRebindRunnable или mFrameCallback переменная mPendingRebind снова будет установлена ​​в значение false. Таким образом, пользовательский интерфейс никогда не будет ссылаться sh.

Я видел эту проблему Привязка данных - XML не обновляется после onActivityResult . Я пытаюсь использовать SingleLiveEvent, и я вызываю updateObserver.call() в onResume Activity. Это не работает.

Я также пытался использовать отражение, чтобы принудительно установить mPendingRebind false. Это работает, но я думаю, что это не очень хороший способ. Что мне делать?

1 Ответ

0 голосов
/ 09 мая 2020

Попробуйте это

var title = ""
@Bindable get() = title
...