LiveData顧名思義活著的數(shù)據(jù),是什么原理導(dǎo)致數(shù)據(jù)能感知程序的生命周期,下面我們就從源碼進(jìn)行解析。
一、LiveData概覽
LiveData為泛型抽象類,泛型主要是為了實(shí)現(xiàn)對(duì)數(shù)據(jù)的適配,構(gòu)造方法很簡(jiǎn)單,一個(gè)無參的構(gòu)造函數(shù)和一個(gè)帶一個(gè)參數(shù)的構(gòu)造函數(shù)

其主要的實(shí)現(xiàn)類MutableLiveData和MediatorLiveData,如圖2 MutableLiveData實(shí)現(xiàn)類很簡(jiǎn)單,基本沒有自己的實(shí)現(xiàn)或者重寫。

MediatorLiveData實(shí)現(xiàn)類也很簡(jiǎn)單,增加了addSource與removeSource方法,并在onActive與onInactive回調(diào)方法中做了關(guān)聯(lián)LiveData的生命周期回調(diào),整個(gè)實(shí)現(xiàn)類是為了別的LiveData數(shù)據(jù)可以感知此MediatorLiveData數(shù)據(jù)的生命周期。

二、LiveData使用流程源碼解析
LiveData新建好了,要想對(duì)數(shù)據(jù)改變有所感知,調(diào)用observe方法,傳入LifecycleOwner對(duì)象和Observer監(jiān)聽接口,LifecycleOwner就是Android生命周期感知的控制類,這就為什么了LiveData能感受生命周期了。繼續(xù)往下看,當(dāng)生面周期為DESTROYED的時(shí)候,直接返回,這就是為啥LiveData不會(huì)在Actvity、Fragment等快要銷毀時(shí)還會(huì)去更改視圖。

新建了一個(gè)LifecycleBoundObserver的包裝類,判斷該觀察者是否存在,如果不存在會(huì)將該觀察者加入到生命周期觀察者容器中。LifecycleBoundObserver類具體是什么呢?下面我們來看一看,如圖5,LifecycleBoundObserver繼承ObserverWrapper、實(shí)現(xiàn)GenericLifecycleObserver接口,GenericLifecycleObserver主要是實(shí)現(xiàn)onStateChanged方法,響應(yīng)組件的生命周期的改變。

ObserverWrapper類基本是一個(gè)空殼子,除了有具體實(shí)現(xiàn)的activeStateChanged方法,具體的運(yùn)用下面講。

如LifeCycle詳解中講到,當(dāng)Observer加到生命周期觀察者容器中時(shí)會(huì)把最新的生命周期狀態(tài)傳過來,并調(diào)用onStateChanged,此時(shí)會(huì)調(diào)用activeStateChanged(shouldBeActive()),這時(shí)候就走到ObserverWrapper?activeStateChanged方法,前面都i是一些活躍標(biāo)志位賦值等,當(dāng)程序?yàn)榛钴S態(tài)時(shí),調(diào)用dispatchingValue->considerNotify,最終調(diào)用bserver.mObserver.onChanged((T)mData)講數(shù)據(jù)傳給觀測(cè)者。


除了初始話方法,LiveData主要還有setValue、postValue方法,前者時(shí)主線程調(diào)用,后者是工作線程調(diào)用,最終都是調(diào)用dispatchingValue->considerNotify。
除了observe方法,LiveData還有一個(gè)observeForever方法,如圖9該方法并沒有傳LifecycleOwner對(duì)象,就是不會(huì)感受生命周期,整個(gè)方法的關(guān)鍵在AlwaysActiveObserver中shouldBeActive方法

永遠(yuǎn)返回true,代表永遠(yuǎn)處于活躍態(tài)。

而LifecycleBoundObserver呢,只有當(dāng)生命周期在STARTED狀態(tài)以后才為活躍態(tài),才會(huì)進(jìn)行真正的監(jiān)聽回調(diào)
