LiveData际看,android新的開發(fā)框架中一個(gè)用于數(shù)據(jù)監(jiān)聽的類咸产,從live這個(gè)詞就可以看出這個(gè)類是有生命的。接下來(lái)我們從源碼的角度來(lái)分析LiveData的實(shí)現(xiàn)仿村。
一锐朴、LiveData的使用方式
首先來(lái)看看LiveData的使用方式蔼囊,非常簡(jiǎn)單焚志。
通過(guò)調(diào)用LiveData的observe()方法,就可以監(jiān)聽對(duì)應(yīng)數(shù)據(jù)的變化畏鼓;如上述的例子酱酬,當(dāng)Location發(fā)生改變時(shí),Observer的onChanged()方法就會(huì)進(jìn)行回調(diào)云矫,從而我們可以針對(duì)Location進(jìn)行任何想要的操作膳沽。
從上邊可以看到,實(shí)現(xiàn)方式很簡(jiǎn)單让禀,并且官網(wǎng)上也有描述挑社,不用關(guān)心數(shù)據(jù)的生命周期、內(nèi)存泄漏巡揍、activity stop后會(huì)出現(xiàn)crash痛阻,配置改變等問(wèn)題。
那么作為一個(gè)有追求的程序員腮敌,肯定無(wú)法只是滿足簡(jiǎn)單的使用阱当,那么LiveData到底是如何解決上述問(wèn)題的呢俏扩?
二、LiveData的生命周期管理
LiveData的生命周期是同傳入的LifecycleOwner綁定到一起的弊添,而LifecycleOwner通過(guò)getLifecycle()方法獲得Lifecycle录淡,進(jìn)而對(duì)Activity或Fragment的生命周期進(jìn)行綁定。(具體如何實(shí)現(xiàn)可以參考http://www.reibang.com/p/757cf4c8c240)
observe()方法是LiveData類中最重要的一個(gè)方法:
1油坝、首先會(huì)對(duì)傳入的LifecycleOwner的狀態(tài)進(jìn)行判斷嫉戚,如果此時(shí)已經(jīng)處于Destory狀態(tài),直接返回免钻;
2彼水、接著會(huì)把傳入observer進(jìn)行包裝,生成一個(gè)繼承于LifecycleObserver的類极舔,為什么要進(jìn)行包裝呢?因?yàn)槲覀兊腖ifecycle只接受實(shí)現(xiàn)LifecycleObserver的類链瓦,直接的Observer是不接受的拆魏。
3、同時(shí)從方法中可以看到慈俯,對(duì)于同一個(gè)Observer渤刃,只能綁定到唯一的Lifecycle上;
4贴膘、接著通過(guò)調(diào)用getLifecycle().addObserver(wrapper)卖子,就將包裝后的Observer類綁定到傳入的Lifecycle上,可見LiveData的生命周期也是通過(guò)Lifecycle來(lái)管理的刑峡;
接下來(lái)看看activeStateChanged()方法會(huì)做些什么呢洋闽?
傳入的參數(shù)newActive決定了當(dāng)前LiveData對(duì)象狀態(tài)的改變,看看下邊的幾種情況:
1突梦、當(dāng)newActive參數(shù)為true诫舅,且當(dāng)前LiveData沒有綁定過(guò)LifeCycleOwner時(shí)(即mActiveCount為0),此時(shí)會(huì)回調(diào)LiveData的onActive()方法宫患;
2刊懈、當(dāng)newActive參數(shù)為false,且當(dāng)前LiveData只綁定了一個(gè)LifeCycleOwner時(shí)娃闲,LiveData會(huì)回調(diào)onInactive()方法虚汛;
3、當(dāng)newActive參數(shù)為true皇帮,此時(shí)還會(huì)回調(diào)dispatchingValue()方法卷哩,觸發(fā)綁定的observer的回調(diào);
可見玲献,onActive()方法是當(dāng)LiveData第一次綁定LifecycleOwner時(shí)觸發(fā)的殉疼,而onInactive()方法則是當(dāng)LiveData解綁最后一個(gè)LifecycleOwner時(shí)觸發(fā)梯浪。
當(dāng)然這一切執(zhí)行的前提就是傳入的newActive參數(shù)與當(dāng)前的狀態(tài)active值不同,那么active的值是如何變化的呢瓢娜?
active的值改變的地方只在activeStageChanged()方法中挂洛,而調(diào)用該方法的地方有如下三處:
1、上邊提到的observe()方法眠砾;
2虏劲、removeObserver()方法;
3褒颈、LifecycleBoundObserver的onStateChange()方法
當(dāng)綁定的LifeCycleOwner的生命周期處于START或RESUME狀態(tài)時(shí)柒巫,isActiveState()都返回true。可見谷丸,只有當(dāng)綁定的LifeCycleOwner的狀態(tài)在active和inactive切換時(shí)堡掏,才會(huì)觸發(fā)LiveData實(shí)際狀態(tài)的改變,active和inactive的內(nèi)部狀態(tài)改變是不對(duì)LiveData的狀態(tài)有任何影響的刨疼。
總結(jié)一下泉唁,傳入的一個(gè)Observer會(huì)生成一個(gè)對(duì)應(yīng)的包裝類LifecycleBoundObserver,Lifecycle會(huì)對(duì)這個(gè)LifecycleBoundObserver進(jìn)行生命周期管理揩慕,當(dāng)LifeCycleOwner的生命周期發(fā)生變化時(shí)亭畜,回調(diào)LifecycleBoundObserver的onStateChange()方法,當(dāng)發(fā)生active和inactive狀態(tài)的切換時(shí)迎卤,會(huì)觸發(fā)LiveData的內(nèi)部方法回調(diào)拴鸵。
三、Observer的數(shù)據(jù)回調(diào)過(guò)程
當(dāng)數(shù)據(jù)發(fā)生變化或生命周期發(fā)生變化時(shí)蜗搔,都會(huì)觸發(fā)Observer的onChanged()回調(diào)劲藐,接下來(lái)看看具體的實(shí)現(xiàn)流程。
從上邊可以看到碍扔,當(dāng)LifecycleOwner的狀態(tài)處于inactive狀態(tài)時(shí)瘩燥,observer的onChanged()是不會(huì)調(diào)用的;另外LiveData用了version來(lái)保證數(shù)據(jù)的準(zhǔn)確性不同,即當(dāng)每一個(gè)Observer需要回調(diào)時(shí)厉膀,會(huì)對(duì)比當(dāng)前Observer的version和LiveData的version,只有LiveData的version的值大時(shí)二拐,才會(huì)觸發(fā)onChanged()的回調(diào)服鹅,并且回調(diào)的會(huì)是最后一次的數(shù)據(jù)。
四百新、觸發(fā)數(shù)據(jù)回調(diào)的時(shí)機(jī)
dispatchingValue()方法調(diào)用地方一個(gè)有兩處:
1企软、setValue()方法處,此時(shí)調(diào)用的是dispatchingValue(null)饭望,會(huì)回調(diào)所有存儲(chǔ)在mObservers里的Observer的onChanged()仗哨;
2形庭、LifecycleBoundObserver中l(wèi)ifecycleOwner生命周期回調(diào)處,此時(shí)調(diào)用的是dispatchingValue(this)厌漂,只會(huì)回調(diào)當(dāng)前Observer的onChanged()回調(diào)萨醒;
至此,可以看到LiveData的整體實(shí)現(xiàn)還是比較簡(jiǎn)單的苇倡,依附于Lifecycle的生命周期管理富纸,只是增加了對(duì)于數(shù)據(jù)的控制邏輯。