首页 > 解决方案 > 调用 Observer.onChanged() 并不意味着内容实际上变得不同

问题描述

观察

方法文档onChanged(T) 在此处输入图像描述

但是,我发现尝试将相同的数据发布到某个LiveDataonChanged仍然会被调用。


实验

// 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")

然后,多次点击按钮


结果 即使发布的字符串总是相同的,每次都会触发观察者。

标签: android-architecture-componentsobserversandroid-livedata

解决方案


源代码追踪

LiveData.setValue →<a href="http://androidxref.com/9.0.0_r3/xref/frameworks/support/lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java#dispatchingValue" rel="nofollow noreferrer"> LiveData.dispatchingValue →<a href="http://androidxref.com/9.0.0_r3/xref/frameworks/support/lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java#considerNotify" rel ="nofollow noreferrer"> LiveData.considerNotify →<code>Observer.onChanged

从到没有Object.equals(Object)检查代码流setValueonChanged

结论

onChanged被调用只是因为LiveData<T>.setValue(T)曾经被调用过。因此,即使onChanged(T)被调用,底层数据可能仍然相同。

要实现真正的“onChanged”,可以使用aMediatorLiveData来观察原来的,根据对象相等性检查LiveData决定是否转发。onChanged


推荐阅读