Android Architecture Components 學(xué)習(xí)筆記

Android Architecture Components 是 Android 新推出的一個(gè)庫(kù)偶洋。目的是為了提供一種統(tǒng)一的開(kāi)發(fā)模式,降低 Android 的開(kāi)發(fā)難度妓雾,提高程序的可維護(hù)性娶吞。該庫(kù)包括了四個(gè)部分:Lifecycle, LiveData, ViewModel 和 Room。

Lifecycle 庫(kù)學(xué)習(xí)筆記

Lifecycle 庫(kù)想要解決的問(wèn)題

  • Activity 和 Fragment 的代碼臃腫.
  • 傳統(tǒng)的代碼組織方式會(huì)導(dǎo)致代碼結(jié)構(gòu)混亂, 同一個(gè)對(duì)象的邏輯分布在 Activity 各個(gè)生命周期函數(shù)中.

Lifecycle 庫(kù)的作用

  • 把 Activity 和 Fragment 的生命周期變成可觀察的對(duì)象.

Lifecycle 庫(kù)的重要對(duì)象

既然 Lifecycle 庫(kù)使用的是觀察者模式, 那么肯定也是分為觀察者, 被觀察者和事件了.

  • LifecycleObserver
  • LifecycleOwner
  • Lifecycle.Event

Lifecycle 的狀態(tài)和事件

Lifecycle 的狀態(tài)有 INITIALIZED, DESTROYED, CREATED, STARTED, RESUMED.

Lifecycle 的事件跟 Activity 和 Fragment 的生命周期一一對(duì)應(yīng). 分別為 CREATE, START, RESUME, PAUSE, STOP 和 DESTROY.


Lifecycle 的事件和狀態(tài)

Lifecycle 對(duì)代碼結(jié)構(gòu)的改善

Lifecycle 的代碼結(jié)構(gòu)

LifecycleObserver 接口探討(日常黑 Java)

LifecycleObserver 是一個(gè)空的接口. 里面并沒(méi)有包含各個(gè)生命周期的回調(diào), 而是采用 annotation 的方法來(lái)標(biāo)記回調(diào), 然后通過(guò) Android Annotation Processor 在編譯的時(shí)候生成 Adapter 作為真正的 Observer.

這樣的設(shè)計(jì)有兩個(gè)好處:

  1. 提供一個(gè)接口的最小化實(shí)現(xiàn), 實(shí)現(xiàn)者只需要實(shí)現(xiàn)必要方法, 而不必為那些不關(guān)心的生命周期也提供一個(gè)空實(shí)現(xiàn).

  2. 方便舊代碼的遷移. 只需要實(shí)現(xiàn)接口, 然后添加對(duì)應(yīng)的 Annotation 即可.

缺點(diǎn)是增加了代碼復(fù)雜度, 有些實(shí)現(xiàn)代碼看著不是那么直接, 在 IDE 查找回調(diào)不是那么簡(jiǎn)單了. 其實(shí) Java 8 的 default 方法的特性就能很好處理這兩個(gè)問(wèn)題. 當(dāng)然我大 Kotlin 也可以漂亮地實(shí)現(xiàn).

ViewModel 的學(xué)習(xí)筆記

ViewModel 的想要解決的問(wèn)題

  • 簡(jiǎn)化處理 Configuration 改變時(shí)的處理邏輯.

在 Android 默認(rèn)的機(jī)制下, 當(dāng) Configuration 改變, 比如屏幕旋轉(zhuǎn)的時(shí)候會(huì)導(dǎo)致 Activity 的銷(xiāo)毀和重建. 比較常規(guī)的思路下, 我們的很多動(dòng)作都是跟 Activity 的創(chuàng)建和銷(xiāo)毀是綁定的. 比如顯示數(shù)據(jù)的創(chuàng)建和銷(xiāo)毀.

但是在 Configuration 改變時(shí)雖然 Activity 被銷(xiāo)毀, 但是跟真的被銷(xiāo)毀的情況是不同的. 遺憾的是從 onCreate 和 onDestory 回調(diào)中無(wú)法直接區(qū)分這兩種情況.

ViewModel 的作用

  • 提供了 ViewModel 的類(lèi), ViewModel 的實(shí)例創(chuàng)建和銷(xiāo)毀與 Activity 生命周期依然是綁定的, 但是在 Configuration 改變是不會(huì)被銷(xiāo)毀.

ViewModel 的生命周期

再次偷懶引用官方的圖:


ViewModel 的生命周期

ViewModel 的不被銷(xiāo)毀的原理

ViewModel 的生命周期看起來(lái)很厲害的樣子. 其實(shí)在官方文檔里關(guān)于如何處理 Configuration改變的文章已經(jīng)提到了利用 RetainedFragment 來(lái)實(shí)現(xiàn)保存數(shù)據(jù), 就可以避免在 Configuration 改變時(shí)被銷(xiāo)毀.

ViewModel 其實(shí)也使用了相同的方法. ViewModel 的實(shí)例保存在 ViewModelStore 了, 方便用戶(hù)獲取實(shí)例. 同時(shí) ViewModelStore 會(huì)交由 HolderFragment 持有, HodlerFragment 就是一個(gè) RetainedFragment. 所以 ViewModel 在 Configuration 改變的時(shí)候不會(huì)被銷(xiāo)毀.

ViewModel 與 onSaveInstanceState 的關(guān)系

  • ViewModel 不能完全替代 onSaveInstanceState 的回調(diào). ViewModel 雖然在 Configuration 改變的時(shí)候不會(huì)銷(xiāo)毀, 但是在系統(tǒng)主動(dòng)清理 (比如內(nèi)存不足) 的時(shí)候依然會(huì)被銷(xiāo)毀. 所以在這些情況下依然需要使用 onSaveInstancceState 來(lái)保存狀態(tài).
  • ViewModel 不存在重建的過(guò)程, 復(fù)雜且不需要持久化應(yīng)該交由 ViewModel 保持.
  • onSaveInstanceState 調(diào)用中往 bundle 里寫(xiě)的信息應(yīng)該盡量少, 只要可以重建 ViewModel 即可.

LiveData 學(xué)習(xí)筆記

LiveData 想要解決的問(wèn)題

  • 異步獲取數(shù)據(jù)與 UI 狀態(tài)的切換配合的代碼煩瑣械姻。

Android 中的大部分顯示數(shù)據(jù)都是異步獲取的妒蛇,可能從網(wǎng)絡(luò),也可以只是讀取數(shù)據(jù)庫(kù)楷拳。但是只要是異步獲取就會(huì)面臨一個(gè)問(wèn)題:當(dāng)獲取數(shù)據(jù)時(shí)绣夺,界面可能已經(jīng)銷(xiāo)毀
一個(gè)比較常見(jiàn)的解決方式就是在 UI 啟動(dòng)的時(shí)候注冊(cè)回調(diào)唯竹,在 UI 銷(xiāo)毀的時(shí)候注銷(xiāo)乐导。這樣就不會(huì)在 UI 銷(xiāo)毀后還接收到更新提示。但是手動(dòng)管理 Observer 容易出錯(cuò)浸颓,LiveData 結(jié)合了 Lifecycle 提出了自動(dòng)管理

LiveData 是什么物臂?

熟悉 ReactiveX 的人:LiveData 可以認(rèn)為是一個(gè)為 Android 深度定制的 BehaviorSubject。定制的部分主要有:

  • 自動(dòng)管理 Observer 的注銷(xiāo)产上。
  • 將 Observer 和 LifecycleOwner 進(jìn)行綁定
  • 自動(dòng)識(shí)別 Lifecycle棵磷,只在合適的時(shí)候通知 Observer 數(shù)據(jù)的變化。

不熟悉 Reactive 的人:

  • LiveData 是一個(gè)可觀察的容器晋涣,當(dāng)容器內(nèi)的值發(fā)生改變時(shí)會(huì)通知觀察者仪媒。

LiveData 會(huì)在什么時(shí)候通知變化?

  • LiveData 根據(jù) Observer 綁定 LifecycleOwner 的狀態(tài)谢鹊,將 Observer 分為 Active 和 Inactive 兩個(gè)狀態(tài)算吩。只會(huì)通知處于 Active 狀態(tài)的觀察者。
  • 當(dāng) Lifecycle Owner 的狀態(tài)為 STARTEDRESUMED 時(shí)認(rèn)為 Observer 是 Active

LiveData 如何處理在 Inactive 狀態(tài)時(shí)的改變佃扼?

  • Observer 處于 Inactive 狀態(tài)下不會(huì)收到任何更新通知偎巢。
  • Observer 從 Inactive 變成 Active 是會(huì)收到一個(gè)新的更新,得到最新的值兼耀。

Observer 一定要綁定一個(gè) LifecycleOwner 嗎压昼?

不一定×鲈耍可以使用 observerForever 方法注冊(cè)一個(gè)不會(huì)被自動(dòng)移除的 Observer窍霞。

LiveData 在什么時(shí)候注銷(xiāo)?

  • 對(duì)于綁定了 LifecycleOwner 的 Observer拯坟,會(huì)在 Lifecycle 進(jìn)入 DESTORYED 狀態(tài)時(shí)注銷(xiāo)但金。
  • 對(duì)于沒(méi)有綁定的 Observer 需要手動(dòng)注銷(xiāo)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郁季,一起剝皮案震驚了整個(gè)濱河市傲绣,隨后出現(xiàn)的幾起案子掠哥,更是在濱河造成了極大的恐慌,老刑警劉巖秃诵,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塞琼,居然都是意外死亡菠净,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)彪杉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毅往,“玉大人,你說(shuō)我怎么就攤上這事派近∨饰ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵渴丸,是天一觀的道長(zhǎng)侯嘀。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谱轨,這世上最難降的妖魔是什么戒幔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮土童,結(jié)果婚禮上诗茎,老公的妹妹穿的比我還像新娘。我一直安慰自己献汗,他們只是感情好敢订,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著罢吃,像睡著了一般楚午。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刃麸,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天醒叁,我揣著相機(jī)與錄音,去河邊找鬼泊业。 笑死把沼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吁伺。 我是一名探鬼主播饮睬,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篮奄!你這毒婦竟也來(lái)了捆愁?” 一聲冷哼從身側(cè)響起割去,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昼丑,沒(méi)想到半個(gè)月后呻逆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菩帝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年咖城,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呼奢。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宜雀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出握础,到底是詐尸還是另有隱情辐董,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布禀综,位于F島的核電站简烘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏菇存。R本人自食惡果不足惜夸研,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望依鸥。 院中可真熱鬧亥至,春花似錦、人聲如沸贱迟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衣吠。三九已至茶敏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缚俏,已是汗流浹背惊搏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忧换,地道東北人恬惯。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亚茬,于是被迫代替她去往敵國(guó)和親酪耳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 懶得處理樣式了, 將就著看吧. 官網(wǎng)地址: https://developer.android.com/topic...
    Reddington_604e閱讀 1,661評(píng)論 0 1
  • 前言 Android Architecture Components刹缝,簡(jiǎn)稱(chēng) AAC 碗暗,是 Google IO 20...
    前行的烏龜閱讀 5,778評(píng)論 3 27
  • 因?yàn)槊總€(gè)人都是獨(dú)一無(wú)二的颈将,每個(gè)人都是非常特殊的,所以在幸福應(yīng)該在自己的內(nèi)心所尋找最安定的地方言疗。胖瘦美丑晴圾。聰明或者愚...
    金池_6e39閱讀 162評(píng)論 0 0
  • 昨夜驚風(fēng)雨,相時(shí)已三更洲守。 來(lái)去人無(wú)多疑务,但覺(jué)雨色深。 河路因風(fēng)動(dòng)梗醇,喬木暗且陰。 淋淋云中子撒蟀,何向幾人期叙谨。
    看他喜歡吧閱讀 169評(píng)論 1 0