android-architecture-components - 调用 Observer.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
→<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)
检查代码流setValue
onChanged
结论
onChanged
被调用只是因为LiveData<T>.setValue(T)
曾经被调用过。因此,即使onChanged(T)
被调用,底层数据可能仍然相同。
要实现真正的“onChanged”,可以使用aMediatorLiveData
来观察原来的,根据对象相等性检查LiveData
决定是否转发。onChanged
推荐阅读
- intellij-idea - 当内部操作开启时,“Go to implementation”键盘映射用于不同的目的
- python - 如何检查列表元素是否满足给定条件?
- angular - SonarQube 安全热点,在 Angular 中使用正则表达式
- eclipse - looking for a way to automatically create blocks in SysML Model
- python - 当尝试使用 selinum 进入下一页时,它会给出列表索引超出范围错误
- python - Discord.py 如何使命令适用于某些角色?
- powershell - Imagebox does not flip an image when needed with Powershell
- winapi - Can't see BlueetoothLE devices
- oracle-nosql - Oracle NoSQL数据库中的运算符BETWEEN和日期,怎么办?
- postgresql - Postgresql 12.5 "relation already exists" when using "create table if not exists"