Android Architecture LiveData

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ù)的控制邏輯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旨椒,一起剝皮案震驚了整個(gè)濱河市晓褪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌综慎,老刑警劉巖涣仿,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寥粹,居然都是意外死亡变过,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門涝涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岛杀,你說(shuō)我怎么就攤上這事阔拳。” “怎么了类嗤?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵糊肠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我遗锣,道長(zhǎng)货裹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任精偿,我火速辦了婚禮弧圆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笔咽。我一直安慰自己搔预,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布叶组。 她就那樣靜靜地躺著拯田,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甩十。 梳的紋絲不亂的頭發(fā)上船庇,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天吭产,我揣著相機(jī)與錄音,去河邊找鬼鸭轮。 笑死臣淤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的张弛。 我是一名探鬼主播荒典,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吞鸭!你這毒婦竟也來(lái)了寺董?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刻剥,失蹤者是張志新(化名)和其女友劉穎遮咖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體造虏,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡御吞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漓藕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陶珠。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖享钞,靈堂內(nèi)的尸體忽然破棺而出揍诽,到底是詐尸還是另有隱情,我是刑警寧澤栗竖,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布暑脆,位于F島的核電站,受9級(jí)特大地震影響狐肢,放射性物質(zhì)發(fā)生泄漏添吗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一份名、第九天 我趴在偏房一處隱蔽的房頂上張望碟联。 院中可真熱鬧,春花似錦同窘、人聲如沸玄帕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裤纹。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹰椒,已是汗流浹背锡移。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漆际,地道東北人淆珊。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奸汇,于是被迫代替她去往敵國(guó)和親施符。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容