简易原理图
对于LiveData架构,我们使用时候都会先声明一个变量如:
val appleCounts = MutableLiveData<Int>()
这里 appleCount 变量相当于一个被观察者者,因为当他发生变化时候,所有注册到 appleCount 的观察者都会受到通知。
- 观察者注册被观察者
appleCount.observeForever { r ->
log("zzz","eat apple sum:$r")
}
这里我们注册了一个观察者,当appleCount中的值发生变化时候触发回调打印日志。
当appleCount中的值发生变化时候,通知观察者们。
appleCount.value = 2
上述是一个最简单的LiveData的使用示例。通过该示例,可以知道LIveData顾名思义内部使用了观察者和被观察者的设计模式。
通过分析LIveData源码,可以得出上图一个原理结构,在每个定义的LIveData对象中,都维护了一个map,该map集合会存储观察者们的回调,当通过setValue方法修改被观察者Livedata的值的时候,会遍历该map中的回调对象,调用其方法,从而告知观察者们。
这是LiveData最简单的一个原理理解。但是我们知道,LiveDate具有特殊的功能,就是可以将观察者们赋予生命周期,当他们生命周期结束后,会自动从map中移除,从而不再出发回调,防止带来异常。
具有生命周期的LiveData
由本文最开始的图可以看到,注册观察者有两种方法,其中一个需要传LifecycleOwner。
对于该方法,会将传入的观察者和该LifecycleOwner 进行绑定,LifecycleOwner生命周期发生变化时候,会决定是否将该观察者从map中移除。
- 原理图
对于生命周期的监控,存在双重保险。
- 在setValue方法中,被观察者在遍历观察者集合时候,会判断当前观察者的生命状态是否正常,通过LifecycleOwner中存储的State变量来判断
- 在activity或fragment中,生命周期为onDestory时候,触发wrapper的onStateChanged方法,将观察者从观察者集合中移除。
方法observeForever为什么和生命周期不挂钩?
因为该方法传入观察者集合中的是对象 AlwaysActiveObserver,该对象在判断生命周期是否正常时候,永远为true,且它没有和LifecyclerOwner绑定,不会受到其生命周期影响。