Android Architecture Components 是 Android 新推出的一個庫。目的是為了提供一種統(tǒng)一的開發(fā)模式,降低 Android 的開發(fā)難度,提高程序的可維護性。該庫包括了四個部分:Lifecycle, LiveData, ViewModel 和 Room。
Lifecycle 庫學習筆記
Lifecycle 庫想要解決的問題
- Activity 和 Fragment 的代碼臃腫.
- 傳統(tǒng)的代碼組織方式會導致代碼結構混亂, 同一個對象的邏輯分布在 Activity 各個生命周期函數(shù)中.
Lifecycle 庫的作用
- 把 Activity 和 Fragment 的生命周期變成可觀察的對象.
Lifecycle 庫的重要對象
既然 Lifecycle 庫使用的是觀察者模式, 那么肯定也是分為觀察者, 被觀察者和事件了.
- LifecycleObserver
- LifecycleOwner
- Lifecycle.Event
Lifecycle 的狀態(tài)和事件
Lifecycle 的狀態(tài)有 INITIALIZED, DESTROYED, CREATED, STARTED, RESUMED.
Lifecycle 的事件跟 Activity 和 Fragment 的生命周期一一對應. 分別為 CREATE, START, RESUME, PAUSE, STOP 和 DESTROY.
Lifecycle 對代碼結構的改善
LifecycleObserver 接口探討(日常黑 Java)
LifecycleObserver 是一個空的接口. 里面并沒有包含各個生命周期的回調(diào), 而是采用 annotation 的方法來標記回調(diào), 然后通過 Android Annotation Processor 在編譯的時候生成 Adapter 作為真正的 Observer.
這樣的設計有兩個好處:
提供一個接口的最小化實現(xiàn), 實現(xiàn)者只需要實現(xiàn)必要方法, 而不必為那些不關心的生命周期也提供一個空實現(xiàn).
方便舊代碼的遷移. 只需要實現(xiàn)接口, 然后添加對應的 Annotation 即可.
缺點是增加了代碼復雜度, 有些實現(xiàn)代碼看著不是那么直接, 在 IDE 查找回調(diào)不是那么簡單了. 其實 Java 8 的 default 方法的特性就能很好處理這兩個問題. 當然我大 Kotlin 也可以漂亮地實現(xiàn).
ViewModel 的學習筆記
ViewModel 的想要解決的問題
- 簡化處理 Configuration 改變時的處理邏輯.
在 Android 默認的機制下, 當 Configuration 改變, 比如屏幕旋轉的時候會導致 Activity 的銷毀和重建. 比較常規(guī)的思路下, 我們的很多動作都是跟 Activity 的創(chuàng)建和銷毀是綁定的. 比如顯示數(shù)據(jù)的創(chuàng)建和銷毀.
但是在 Configuration 改變時雖然 Activity 被銷毀, 但是跟真的被銷毀的情況是不同的. 遺憾的是從 onCreate 和 onDestory 回調(diào)中無法直接區(qū)分這兩種情況.
ViewModel 的作用
- 提供了 ViewModel 的類, ViewModel 的實例創(chuàng)建和銷毀與 Activity 生命周期依然是綁定的, 但是在 Configuration 改變是不會被銷毀.
ViewModel 的生命周期
再次偷懶引用官方的圖:
ViewModel 的不被銷毀的原理
ViewModel 的生命周期看起來很厲害的樣子. 其實在官方文檔里關于如何處理 Configuration改變的文章已經(jīng)提到了利用 RetainedFragment 來實現(xiàn)保存數(shù)據(jù), 就可以避免在 Configuration 改變時被銷毀.
ViewModel 其實也使用了相同的方法. ViewModel 的實例保存在 ViewModelStore 了, 方便用戶獲取實例. 同時 ViewModelStore 會交由 HolderFragment 持有, HodlerFragment 就是一個 RetainedFragment. 所以 ViewModel 在 Configuration 改變的時候不會被銷毀.
ViewModel 與 onSaveInstanceState 的關系
- ViewModel 不能完全替代 onSaveInstanceState 的回調(diào). ViewModel 雖然在 Configuration 改變的時候不會銷毀, 但是在系統(tǒng)主動清理 (比如內(nèi)存不足) 的時候依然會被銷毀. 所以在這些情況下依然需要使用 onSaveInstancceState 來保存狀態(tài).
- ViewModel 不存在重建的過程, 復雜且不需要持久化應該交由 ViewModel 保持.
- onSaveInstanceState 調(diào)用中往 bundle 里寫的信息應該盡量少, 只要可以重建 ViewModel 即可.
LiveData 學習筆記
LiveData 想要解決的問題
- 異步獲取數(shù)據(jù)與 UI 狀態(tài)的切換配合的代碼煩瑣。
Android 中的大部分顯示數(shù)據(jù)都是異步獲取的,可能從網(wǎng)絡,也可以只是讀取數(shù)據(jù)庫。但是只要是異步獲取就會面臨一個問題:當獲取數(shù)據(jù)時,界面可能已經(jīng)銷毀。
一個比較常見的解決方式就是在 UI 啟動的時候注冊回調(diào),在 UI 銷毀的時候注銷。這樣就不會在 UI 銷毀后還接收到更新提示。但是手動管理 Observer 容易出錯,LiveData 結合了 Lifecycle 提出了自動管理
LiveData 是什么?
熟悉 ReactiveX 的人:LiveData 可以認為是一個為 Android 深度定制的 BehaviorSubject。定制的部分主要有:
- 自動管理 Observer 的注銷。
- 將 Observer 和 LifecycleOwner 進行綁定
- 自動識別 Lifecycle,只在合適的時候通知 Observer 數(shù)據(jù)的變化。
不熟悉 Reactive 的人:
- LiveData 是一個可觀察的容器,當容器內(nèi)的值發(fā)生改變時會通知觀察者。
LiveData 會在什么時候通知變化?
- LiveData 根據(jù) Observer 綁定 LifecycleOwner 的狀態(tài),將 Observer 分為 Active 和 Inactive 兩個狀態(tài)。只會通知處于 Active 狀態(tài)的觀察者。
- 當 Lifecycle Owner 的狀態(tài)為 STARTED 和 RESUMED 時認為 Observer 是 Active
LiveData 如何處理在 Inactive 狀態(tài)時的改變?
- Observer 處于 Inactive 狀態(tài)下不會收到任何更新通知。
- Observer 從 Inactive 變成 Active 是會收到一個新的更新,得到最新的值。
Observer 一定要綁定一個 LifecycleOwner 嗎?
不一定。可以使用 observerForever 方法注冊一個不會被自動移除的 Observer。
LiveData 在什么時候注銷?
- 對于綁定了 LifecycleOwner 的 Observer,會在 Lifecycle 進入 DESTORYED 狀態(tài)時注銷。
- 對于沒有綁定的 Observer 需要手動注銷。