LiveData原理详析

LiveData顾名思义活着的数据,是什么原理导致数据能感知程序的生命周期,下面我们就从源码进行解析。

一、LiveData概览

LiveData为泛型抽象类,泛型主要是为了实现对数据的适配,构造方法很简单,一个无参的构造函数和一个带一个参数的构造函数

图1

其主要的实现类MutableLiveData和MediatorLiveData,如图2 MutableLiveData实现类很简单,基本没有自己的实现或者重写。

图2

MediatorLiveData实现类也很简单,增加了addSource与removeSource方法,并在onActive与onInactive回调方法中做了关联LiveData的生命周期回调,整个实现类是为了别的LiveData数据可以感知此MediatorLiveData数据的生命周期。

图3

二、LiveData使用流程源码解析

LiveData新建好了,要想对数据改变有所感知,调用observe方法,传入LifecycleOwner对象和Observer监听接口,LifecycleOwner就是Android生命周期感知的控制类,这就为什么了LiveData能感受生命周期了。继续往下看,当生面周期为DESTROYED的时候,直接返回,这就是为啥LiveData不会在Actvity、Fragment等快要销毁时还会去更改视图。

图4

新建了一个LifecycleBoundObserver的包装类,判断该观察者是否存在,如果不存在会将该观察者加入到生命周期观察者容器中。LifecycleBoundObserver类具体是什么呢?下面我们来看一看,如图5,LifecycleBoundObserver继承ObserverWrapper、实现GenericLifecycleObserver接口,GenericLifecycleObserver主要是实现onStateChanged方法,响应组件的生命周期的改变。

图5

ObserverWrapper类基本是一个空壳子,除了有具体实现的activeStateChanged方法,具体的运用下面讲。

图6

LifeCycle详解中讲到,当Observer加到生命周期观察者容器中时会把最新的生命周期状态传过来,并调用onStateChanged,此时会调用activeStateChanged(shouldBeActive()),这时候就走到ObserverWrapper activeStateChanged方法,前面都i是一些活跃标志位赋值等,当程序为活跃态时,调用dispatchingValue->considerNotify,最终调用bserver.mObserver.onChanged((T)mData)讲数据传给观测者。

图7
图8

除了初始话方法,LiveData主要还有setValue、postValue方法,前者时主线程调用,后者是工作线程调用,最终都是调用dispatchingValue->considerNotify。

除了observe方法,LiveData还有一个observeForever方法,如图9该方法并没有传LifecycleOwner对象,就是不会感受生命周期,整个方法的关键在AlwaysActiveObserver中shouldBeActive方法

图9

永远返回true,代表永远处于活跃态。

图10

而LifecycleBoundObserver呢,只有当生命周期在STARTED状态以后才为活跃态,才会进行真正的监听回调

图11
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容