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的引用。
一句话总结
用LiveData源码中的注释总结就是
LiveData is a data holder class that can be observed within a given lifecycle.
精辟