LiveData顾名思义活着的数据,是什么原理导致数据能感知程序的生命周期,下面我们就从源码进行解析。
一、LiveData概览
LiveData为泛型抽象类,泛型主要是为了实现对数据的适配,构造方法很简单,一个无参的构造函数和一个带一个参数的构造函数

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

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

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

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

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

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


除了初始话方法,LiveData主要还有setValue、postValue方法,前者时主线程调用,后者是工作线程调用,最终都是调用dispatchingValue->considerNotify。
除了observe方法,LiveData还有一个observeForever方法,如图9该方法并没有传LifecycleOwner对象,就是不会感受生命周期,整个方法的关键在AlwaysActiveObserver中shouldBeActive方法

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

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

网友评论