不贴代码能说明白 Android LiveData 原理吗(一)

1,278 阅读3分钟

LifecycleOwner如何提供周期生命周期的变化?

LifecycleObserver如何得知生命周期的变化?

LiveData的背后隐藏了多少不为人知的秘密?

这一切都要从观察者模式说起...

image.png

起源

何为观察者模式,在代码中最直接的表现就是在事件发生之前,向事件管理者注册回调,通常是让事件管理者持有自己的引用,并且是以接口的形式。

LiveData的作用是持有数据,并在正确的时机,将数据分发给所有观察LiveDataObserver对象,这不就是观察者模式吗,但更为有趣的是,当这个观察者具有生命周期的属性时,他会存在某些时刻不想观察LiveData数据的变化,在某个时刻又想要知道LiveData持有的最新数据,这个Observer可能存活于ActivityFragment中,朝生夕死,也可能它就是Activity或fragment本身。

暗中观察

QQ20220606-234404@2x.png

于是在LiveData的内部,观察者以ObserverWrapper的形式,将具有生命周期的LifeCycleOwnerObserver封装到了一起,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方法中。

ObserveronChange方法会在什么时候收到通知?

1.当Livedata postvaluesetValue时,会遍历Livedata保存的所有ObserverWrapper,决定是否要通知他LiveData持有的最新数据,非active状态或Observer的数据已是最新版本就不通知;active状态至少是owner的STARTED状态 。

2.当ObserveLifecycleObserver接口收到owner生命周期变化的通知时,也会根据一些特定条件,如是否变为active状态,来决定是否将Livedata的最新数据通知给自己,也就是主动去获取LiveData的最新数据。

LiveData如何避免Activity内存泄漏?

观察者模式中,LiveData作为数据持有者,势必要持有Observer的引用,才可以发送数据,为了让Observer具有生命周期属性,ObserverLifecycleOwner又被LiveData内部的ObserverWrapper绑定到了一起,那么LiveData最终间接持有了Activity的引用,LifecycleOwner通常是Activity或者Fragment。

为了避免内存泄漏和非必要的数据更新,自然要利用观察到的owner的生命周期,在Activity 销毁时,从保存Observer和对应warpper的Map集合中,及时remove 掉ObserverLifycleOwner的引用。

一句话总结

LiveData源码中的注释总结就是

LiveData is a data holder class that can be observed within a given lifecycle.

精辟

image.png