数据倒灌现象
对于LiveData“数据倒灌”的问题,我相信很多人已经都了解了,这里提一下。所谓的“数据倒灌”:其实是类似粘性广播那样,当新的观察者开始注册观察时,会把上次发的最后一次的历史数据传递给当前注册的观察者。
比如在在下面的例子代码中:
val testViewModel = ViewModelProvider(this)[TestViewModel::class.java]
testViewModel.updateData("第一次发送数据")
testViewModel.testLiveData.observe(this,object :Observer<String>{
override fun onChanged(value: String) {
println("==============$value")
}
})
updateData
方法发送了一次数据,当下面调用LiveData的observe
方法时,会立即打印==============第一次发送数据
,这就是上面说的“数据倒灌”现象。
发生原因
原因其实也很简单,其实就是 LiveData
内部有一个mVersion
字段,记录版本,其初始的 mVersion
是-1,当我们调用了其 setValue
或者 postValue
,其 mVersion
会+1
;对于每一个观察者的封装 ObserverWrapper
,其初始 mLastVersion
也为-1
,也就是说,每一个新注册的观察者,其 mLastVersion
为-1;当 LiveData
设置这个 ObserverWrapper
的时候,如果 LiveData
的 mVersion
大于 ObserverWrapper
的 mLastVersion
,LiveData
就会强制把当前 value
推送给 Observer
。
也就是下面这段代码
private void considerNotify(ObserverWrapper observer) {