Everything negative-pressure,challenges-is all an opportunity for me to rise
10 October 2020
通常LiveData
存在于ViewModel
,这样可保证在配置变更(如旋转)情况下,LiveData
数据源稳定存在。
LiveData
作为可观察对象,提供以下两种观察方式:
所有通过这种方式添加的Observer
都会包装成LifecycleBoundObserver
,这样Observer
就和LifecycleOwner
的生命周期绑定,由LifecycleOwner
的生命周期决定当前Observer
是否是活动(active)状态,LiveData
规定的活动状态是: LifecycleOwner
的Lifecyle state至少是STARTED,也就是Activity/Fragment的生命周期处于onStart, onResume或onPause,下图解释Lifecycle中STATE和EVENT的关系。
不仅如此,Lifecycle的加入也让观察者对象具备根据活动(active)状态主动分发数据的能力。这意味着如果LiveData
在LifecycleOwner
非活动状态下发送数据,这时候数据不会通知给观察者,而是先存储下来,等待LifecycleOwner
处于活动状态后再将数据分发给观察者。
由于Observer
会包装成LifecycleBoundObserver
交给Lifecycle管理,当受到DESTROYED信号的时候,它会自动移除该观察者。
所有通过这种方式添加的Observer
都会包装成AlwaysActiveObserver
,该观察者会一直处于活动(active)状态,这样LiveData
发送的所有数据都会通知给观察者。
不像LifecycleBoundObserver
会自动移除观察者,AlwaysActiveObserver
需要我们手动手动的去移除观察这对象。
LiveData
提供了两种通知方式:
这个方法用于发送数据所处的线程是工作线程时,数据会存储到mPendingData
,直到系统调度Runnable
到主线程去执行的时候把mPendingData
通过setValue()
分发出去,再系统调度过程中,mPendingData
之存储最近一次更新的数据,这个方法是线程安全。
这里系统调用Runnable
到主线程的时候,Handler
发送的是异步消息,这样使消息不受同步屏障的影响尽快得到调度,降低因系统调度的延迟造成部分数据丢失的情况。
这个方法用于发送数据所处的线程是主线程是,它会将数据存储在mData
等待合适的条件去分发(根据观察者的类型),将mVersion
递增,让观察者对象与自己的mLastVersion
对比,以确定是否有可用的数据等待去分发(mVersion > mLastVersion)。
— Lenox Xian