Вызов Observer.onChanged () не означает, что контент на самом деле становится другим - PullRequest
0 голосов
/ 13 ноября 2018

Наблюдение

Документация метода onChanged(T) enter image description here

Но я обнаружил, что пытаясьчтобы отправить те же данные на определенный LiveData, все равно будет вызван onChanged.


Эксперимент

// member variable of an activity
val liveString = MutableLiveData<String>()

// onCreate
liveString.observe(this/*an activity*/, Observer { Log.d(TAG, it) })

// when a button is clicked
liveString.postValue("abc")

Затем нажмите кнопкумного раз


Результат Даже опубликованная строка всегда одинакова, наблюдатель будет запускаться каждый раз.

1 Ответ

0 голосов
/ 13 ноября 2018

Трассировка исходного кода

LiveData.setValueLiveData.dispatchingValueLiveData.considerNotifyObserver.onChanged

Нет Object.equals(Object) проверки в потоке кода от setValue до onChanged

Вывод

onChanged вызывается только потому, чтоLiveData<T>.setValue(T) когда-либо назывался.Следовательно, даже если вызывается onChanged(T), базовые данные могут оставаться такими же.

Для достижения реального значения onChanged вы можете использовать MediatorLiveData для наблюдения за исходным LiveData и решить, следует липереслать onChanged на основе проверки равенства объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...