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 對(duì)代碼結(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è)好處:
提供一個(gè)接口的最小化實(shí)現(xiàn), 實(shí)現(xiàn)者只需要實(shí)現(xiàn)必要方法, 而不必為那些不關(guān)心的生命周期也提供一個(gè)空實(shí)現(xiàn).
方便舊代碼的遷移. 只需要實(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 的不被銷(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)為 STARTED 和 RESUMED 時(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)。