У меня проблемы с привязкой данных 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. Это работает, но я думаю, что это не очень хороший способ. Что мне делать?