设计架构 Link to heading

img

通常LiveData存在于ViewModel,这样可保证在配置变更(如旋转)情况下,LiveData数据源稳定存在。

观察 Link to heading

LiveData作为可观察对象,提供以下两种观察方式:

observe [LifecycleBoundObserver] Link to heading

所有通过这种方式添加的Observer都会包装成LifecycleBoundObserver,这样Observer就和LifecycleOwner的生命周期绑定,由LifecycleOwner的生命周期决定当前Observer是否是活动(active)状态,LiveData规定的活动状态是: LifecycleOwner的Lifecyle state至少是STARTED,也就是Activity/Fragment的生命周期处于onStart, onResumeonPause,下图解释Lifecycle中STATEEVENT的关系。

img

不仅如此,Lifecycle的加入也让观察者对象具备根据活动(active)状态主动分发数据的能力。这意味着如果LiveDataLifecycleOwner非活动状态下发送数据,这时候数据不会通知给观察者,而是先存储下来,等待LifecycleOwner处于活动状态后再将数据分发给观察者。

由于Observer会包装成LifecycleBoundObserver交给Lifecycle管理,当受到DESTROYED信号的时候,它会自动移除该观察者。

observeForever [AlwaysActiveObserver] Link to heading

所有通过这种方式添加的Observer都会包装成AlwaysActiveObserver,该观察者会一直处于活动(active)状态,这样LiveData发送的所有数据都会通知给观察者。

不像LifecycleBoundObserver会自动移除观察者,AlwaysActiveObserver需要我们手动手动的去移除观察这对象。

通知 Link to heading

LiveData提供了两种通知方式:

postValue Link to heading

这个方法用于发送数据所处的线程是工作线程时,数据会存储到mPendingData,直到系统调度Runnable到主线程去执行的时候把mPendingData通过setValue()分发出去,再系统调度过程中,mPendingData之存储最近一次更新的数据,这个方法是线程安全。

这里系统调用Runnable到主线程的时候,Handler发送的是异步消息,这样使消息不受同步屏障的影响尽快得到调度,降低因系统调度的延迟造成部分数据丢失的情况。

setValue Link to heading

这个方法用于发送数据所处的线程是主线程是,它会将数据存储在mData等待合适的条件去分发(根据观察者的类型),将mVersion递增,让观察者对象与自己的mLastVersion对比,以确定是否有可用的数据等待去分发(mVersion > mLastVersion)。