LiveData源码分析

LiveData

LiveDataRxJava里的Observable类似,可以添加一个订阅者Observer。当LiveData的值发生变化时,Observer可以收到变化的值。所以源码分析主要分析LiveData的订阅和更新数据。

RxJava并没有提供与生命周期绑定的方法,一般我们可以通过第三方库RxLifecycle或者AutoDispose来实现自动解绑。LiveDataobserve()方法要求传递一个LifecycleOwner对象,当生命周期结束时自动解绑,避免内存泄露。

LiveData是一个抽象类,所以我们只能使用它的子类。

LiveData类图

LiveData内部定义了一个mVersion来管理数据的版本。通过observer()传进来的Observer对象会被包装成一个ObserverWrapper对象,内部同样定义了一个mLastVersion。如果ObserverWrappermLastVersion小于mVersion就会分发数据。

订阅数据

我们有三种方式来订阅LiveData

  • 扩展函数observe()

  • observe()

  • observeForever()

扩展函数observe()

扩展函数允许我们传入一个函数类型,内部还是调用的observe()

observe()

observe()会首先判断是否在主线程中,不在主线程会直接抛异常。然后判断当前LifecycleOwner如果处于DESTORYED状态直接返回。如果以上两个条件都通过的话,传入的Observer会被包装成一个LifecycleBoundObserver对象,这个对象我们后面再进行介绍。然后以传入的Observerkey,创建的```LifecycleBoundObserver``为value存入到mObservers中,如果相同的Observer已经存在,则抛出异常。因此,不允许在不同的生命周期中添加相同的Observer

ObserverWrapper

ObserverWrapperLiveData的内部抽象类。有两个子类LifecycleBoundObserverAlwaysActiveObserver

ObserverWrapper类图

ObserverWrappermLastVersion用于与LiveDatamVersion进行比较。shouldBeActive()判断是否处于活跃状态。isAttachedTo()判断是否与LifecycleOwner绑定。detachObserver()用于移除Observer。活跃发生改变时会调用activeStateChanged(),活跃状态之前是不活跃并且传入的状态是活跃状态会调用LiveDataonActive(),如果不活跃的状态则会调用LiveDataonInactive()。如果是活跃状态,则会分发数据。

LifecycleBoundObserver

Lifecycle的当前状态是STARTED 或者 RESUMED 时才认为Observer 是处于活跃状态。当调用LifecycleOwneraddObserver()会触发onStateChanged(),我们创建LiveData时赋值的mData就会调用dispatchingValue()发送出去。

observeForever()

通过observeForever()方法订阅,不受生命周期影响,一直处于活跃状态,也不会自动移除Observer。

更新LiveData值

更新LiveData的值有两种方式

  • setValue():只能在主线程中更新值

  • postValue():可以在任意线程中更新值

setValue()

setValue()中会将新的值赋值给mData,如果当前Observer不活跃,多次调用setValue(),当Observer切换为活跃状态,只会收到最后一次的值。

postValue()

postValue()可以在任意线程中更新数据,其内部其实是把传入的值传递给mPendingData。然后在mPostValueRunnable调用setValuemPostValueRunnable是一个Runnable对象,通过Handler发送给主线程。mPendingDatamPostValueRunnable中会被再次赋值为NO_SET。如果在mPostValueRunnablerun方法尚未执行时,再次调用postValue(),此时postTask为空,则直接返回。

TaskExecutor

postValue()中,调用了ArchTaskExecutorpostToMainThread方法,将mPostValueRunnable传递到主线程,我们简单分析下TaskExecutor

参考

最后更新于