Android 架構組件-Lifecycle、LiveData、ViewModel


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的使用:

https://www.jianshu.com/p/721cdcdf11b2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM