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

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

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

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

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

起源

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

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

暗中观察

在这里插入图片描述

于是在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的引用。

一句话总结

用LvieData源码中的注释总结就是

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

精辟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值