jetpack-liveData 原理解析

什么是liveData

liveData是个可观察的数据持有者,和常规的observable不同,liveData具有生命周期感知的,这意味着它能够在activity fragment service中正确的处理生命周期。liveData很少单独使用,更多的是和Android jetpack 其他组件配合使用,比如viewmodel。
当数据更新后,liveData就会通知它所以的观察者,和RXJava不同的时候,liveData 并不是通知所有的观察者,它只会通知处于Active状态的观察者。如果一个观察者处于Paused状态或者destoryed状态(lifecycle状态),不会收到通知。
liveData也不会产生内存泄漏问题,开发者不需要在onPause或者onDestory中解除对liveData的订阅,因为liveData在内部结构中,会一直判断当前状态,当处于destoryed时候,就会自动移除订阅。

111.png
116.png

liveData基本使用-- 创建实例,订阅观察者,发送数据

1.创建liveData实例对象。mutableLiveData继承LiveData(抽象类)

444.png

2.订阅(observe)观察者,传入lifecycle对象和Observer接口,Observer是个泛型接口,为了回调数据,只声明了一个onChanged函数。

333.png

3.发送数据,postValue 异步子线程发送,setValue 主线程发送

222.png

案例模拟,liveData只有在resumed和started状态 才会发送数据

666.png
777.png

liveData 粘性数据,先发送数据,后订阅,也能接收到发送的数据

100.png
999.png
114.png
115.png

liveData 源码解析

liveData订阅-- observe

订阅的过程,就是创建观察者,对lifecycle进行订阅,如此就可以感知activity fragment等生命周期

102.png

103.png
201.png
202.png
203.png
204.png
206.png
112.png
113.png

liveData 发送数据--- postValue和setValue

postValue 通过 handle 从子线程切换为主线程,最终还是调用setValue

107.png
108.png
110.png
109.png
104.png
112.png
113.png

你可能感兴趣的:(jetpack-liveData 原理解析)