代码之家  ›  专栏  ›  技术社区  ›  Owen Chen

调用observer.onChanged()并不意味着内容实际上变的不同

  •  0
  • Owen Chen  · 技术社区  · 7 年前

    观察

    The documentation of method 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 回复  |  直到 7 年前
        1
  •  1
  •   Owen Chen    7 年前

    源代码跟踪

    LiveData.setValue 艾斯 LiveData.dispatchingValue 艾斯 LiveData.considerNotify 艾斯 Observer.onChanged

    没有 Object.equals(Object) 签入代码流 setValue onChanged

    结论

    被改变的 只是因为 LiveData<T>.setValue(T) 被召唤过。 因此,即使 onChanged(T) 调用时,基础数据可能仍然相同。

    要实现真正的“onchanged”,可以使用 MediatorLiveData 观察原稿 LiveData ,并决定是否转发 被改变的 基于对象相等性检查。