观察
The documentation of method onChanged(T)
onChanged(T)
但是,我发现试图将相同的数据发布到 LiveData , onChanged 仍将被调用。
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")
然后,多次单击该按钮
结果 即使发布的字符串总是相同的,观察者每次都会被触发。
源代码跟踪
LiveData.setValue 艾斯 LiveData.dispatchingValue 艾斯 LiveData.considerNotify 艾斯 Observer.onChanged
LiveData.setValue
LiveData.dispatchingValue
LiveData.considerNotify
Observer.onChanged
没有 Object.equals(Object) 签入代码流 setValue 到 onChanged
Object.equals(Object)
setValue
结论
被改变的 只是因为 LiveData<T>.setValue(T) 被召唤过。 因此,即使 onChanged(T) 调用时,基础数据可能仍然相同。
被改变的
LiveData<T>.setValue(T)
要实现真正的“onchanged”,可以使用 MediatorLiveData 观察原稿 LiveData ,并决定是否转发 被改变的 基于对象相等性检查。
MediatorLiveData