LifecycleOwner如何提供周期生命周期的变化?
LifecycleObserver如何得知生命周期的变化?
LiveData的背后隐藏了多少不为人知的秘密?
这一切都要从观察者模式说起…
起源
何为观察者模式,在代码中最直接的表现就是在事件发生之前,向事件管理者注册回调,通常是让事件管理者持有自己的引用,并且是以接口的形式。
LiveData
的作用是持有数据,并在正确的时机,将数据分发给所有观察LiveData
的Observer
对象,这不就是观察者模式吗,但更为有趣的是,当这个观察者具有生命周期的属性时,他会存在某些时刻不想观察LiveData数据的变化,在某个时刻又想要知道LiveData
持有的最新数据,这个Observer
可能存活于Activity
或Fragment
中,朝生夕死,也可能它就是Activity或fragment本身。
暗中观察
于是在LiveData
的内部,观察者以ObserverWrapper
的形式,将具有生命周期的LifeCycleOwner
和Observer
封装到了一起,Observer
也可以是Lifecycleowner
本身,Lifecycleowner
通常是Activity或Fragment。
Observer
由开发者负责实现Observer
接口,用来让Livedata
通知Observer
关于持有的data的变化,而包装后的ObserverWrapper
对象内部实现了LifecycleObserver
接口,这样ObserverWrapper
既能观察lifecycleowner
的生命周期的变化,又能观察Livedata
持有的的数据变化。
换句话说,在owner的生命周期发生变化或者Livedata
持有的数据发生变化时,wrapper对象都可以从对应的接口收到最新数据的通知;
那接下来的事情,就是处理何时将这些变化发送到wrapper对象,wrapper对象再根据特定条件将通知分发给真正的Observer
对象;大胆猜想一下,这个特定条件就是owner的生命周期状态。
Livedata
根据owner的生命周期状态来分发最新数据到Observer
的onChange方法中。
Observer
的onChange
方法会在什么时候收到通知?
1.当Livedata postvalue
或setValue
时,会遍历Livedata
保存的所有ObserverWrapper
,决定是否要通知他LiveData
持有的最新数据,非active状态或Observer
的数据已是最新版本就不通知;active状态至少是owner的STARTED
状态 。
2.当Observe
的LifecycleObserver
接口收到owner生命周期变化的通知时,也会根据一些特定条件,如是否变为active状态,来决定是否将Livedata
的最新数据通知给自己,也就是主动去获取LiveData
的最新数据。
LiveData
如何避免Activity内存泄漏?
观察者模式中,LiveData
作为数据持有者,势必要持有Observer
的引用,才可以发送数据,为了让Observer
具有生命周期属性,Observer
和LifecycleOwner
又被LiveData内部的ObserverWrapper
绑定到了一起,那么LiveData
最终间接持有了Activity的引用,LifecycleOwner
通常是Activity或者Fragment。
为了避免内存泄漏和非必要的数据更新,自然要利用观察到的owner的生命周期,在Activity 销毁时,从保存Observer
和对应warpper的Map集合中,及时remove 掉Observer
和LifycleOwner
的引用。
一句话总结
用LvieData源码中的注释总结就是
LiveData is a data holder class that can be observed within a given lifecycle.
精辟