Lifecycle
Lifecycle組件包括LifecycleOwner、LifecleObserver,能方便監聽Activity或者Fragment的生命周期。
步驟:
1.實現LifecycleObserver接口
- 實現DefaultLifecycleObserver接口,然后重寫里面生命周期方法;
- 直接實現LifecycleObserver接口,然后通過注解的方式來接收生命周期的變化;
對於這兩種形式,Lifecycle.java文檔中是建議使用第一種方式,因為文檔中說明了,隨着Java8成為主流,注解的方式會被棄用。
2.添加觀察者。
通過getLifecycle().addObserver(mPresenter)方法
Activity基類實現了LifecycleOwner方法,因此可以直接獲取該方法。
3.監聽生命周期。
注意:activity/Fragment的生命周期發生改變時,onStart、onResume方法會先被調用后,再調用Observer中重寫方法,onPause/onDestory反之。
ViewModel
ViewModel是一個用來為Activity或Fragment管理數據的類,ViewModel一般用來處理Activity/Fragment和應用其他部分數據的通信。
ViewModel創建與一個作用域(Activity/Fargment)有關,只要組件不被Destory,那么Viewmodel會一直存活。viewmodel創建后會存儲這個這個作用域,在activity重新恢復時,會返回已存在的viewmodel。
例如,如果作用域是一個Activity,那么Viewmodel會一直保留直到Activity生命周期結束。但是在activity橫豎屏切換中,activity執行了onDestory方法,並不代表該Activity被銷毀,我們可以通過isFinishing方法得知。旋轉屏幕時,isFinishing為false,按下返回鍵時,isFinishing為true。
viewmodel的作用是管理UI的數據,不能訪問UI或者持有activity/Fragment的引用。
LiveData
LiveData是一個數據持有類,具有如下特點:
1.數據可以被觀察者訂閱。
2.能感知組件(Fragment、Activity、Service)的生命周期。
2.只有在組件處於激活狀態(STATED、RESUME)才會通知數據刷新。(除了onDestory方法為DESTORY狀態,其他回調方法皆為STARTD/RESUME等)
LiveData的優點:
- 能夠保證數據和UI統一
這個和LiveData采用了觀察者模式有關,LiveData是被觀察者,當數據有變化時會通知觀察者(UI)。
- 減少內存泄漏
這是因為LiveData能夠感知到組件的生命周期,當組件處於DESTROYED狀態時,觀察者對象會被清除掉。
- 當Activity停止時不會引起崩潰
這是因為組件處於非激活狀態時,不會收到LiveData中數據變化的通知。
- 不需要額外的手動處理來響應生命周期的變化
這一點同樣是因為LiveData能夠感知組件的生命周期,所以就完全不需要在代碼中告訴LiveData組件的生命周期狀態。
- 組件和數據相關的內容能實時更新
組件在前台的時候能夠實時收到數據改變的通知,這是可以理解的。當組件從后台到前台來時,LiveData能夠將最新的數據通知組件,這兩點就保證了組件中和數據相關的內容能夠實時更新。
- 針對configuration change時,不需要額外的處理來保存數據
我們知道,當你把數據存儲在組件中時,當configuration change(比如語言、屏幕方向變化)時,組件會被recreate,然而系統並不能保證你的數據能夠被恢復的。當我們采用LiveData保存數據時,因為數據和組件分離了。當組件被recreate,數據還是存在LiveData中,並不會被銷毀。
- 資源共享
通過繼承LiveData類,然后將該類定義成單例模式,在該類封裝監聽一些系統屬性變化,然后通知LiveData的觀察者。
LiveData使用:
LiveData內部是通過Lifecycle實現監聽回調的,具體可以看源碼。
步驟:
1.創建保存特定數據類型的LiveData實例;
2.創建Observer對象,作為參數傳入LiveData添加觀察者;
3.更新LiveData對象存儲數據。
1.添加依賴
//viewModel api 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha02' //LifecycleObserver 與 LiveData api 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha02'
2.創建LiveData實例
Android文檔中建議將LiveData與ViewModel配合起來使用,當然它也可以單獨使用,不過需要注意數據和組件之間的分離,LiveData一定不能持有組件的對象,否則在組件被銷毀時,LiveData仍持有Activity/Fragment 對象,導致的結果是組件無法被回收。
MutableLiveData為LiveData的子類。
3.創建Observer對象,添加觀察者。
在組件中創建通過LiveData.Observe()方法添加觀察者,當數據變化時會通過該回調方法通知觀察者,彈出吐司。
添加觀察者的方式為2種:
- observe()方法:當組件生命周期發生變化時,onStateChanged()方法會被調用。組件為DESTORY狀態時,會自動取消訂閱。
- observeForever()方法:onStateChanged()方法會被調用三次(CREATED、STARTED、RESUMED),后面就不會收到DESTROYED的狀態,需要手動取消訂閱。
4.更新LiveData中的數據。
更新LiveData有2種方式,:
- setValue() :主線程中調用,如果非主線程,會拋出異常。
- postValue() :既可以在主線程也可以在子線程中調用,最終會調用setValue方法改變存儲的數據。
參考鏈接:
1.https://blog.csdn.net/zhuzp_blog/article/details/78871374
2.https://blog.csdn.net/zhuzp_blog/article/details/78871527
3.viewmodel和LiveData的使用: