讓ViewModel也感知Activity(Fragment)的生命週期 #定製屬於自己的ViewModel(一)
關於Jetpack
Android 推出了他的Jetpack組件讓Android開發者來快速構建Android App,其中就包括ViewModel,Lifecycles,LiveData。
ViewModel被用來存儲View的狀態,以及View相關的數據;Lifecycles被用來感知Activity或Fragment的生命週期;LiveData可以在數據集發生變化的同時通知UI(即View)做出相應改變。
LiveData在這裏我們可以用RxJava2代替,理論上ViewModel是不需要感知UI層的生命週期變化的,但我們需要在UI狀態發生變化的時候做一些相應的事情,所以讓ViewModel可以感知到UI層的變化可以讓一些事變的更簡單一點。
ViewModel的獲取
一般獲得ViewModel是通過如下方式: viewModel= viewModel= ViewModelProviders.of(this).get(ViewModel::class.java)
這裏的this可以是Activity也可以是Fragment。但ViewModelProviders還有兩個重載方法 public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory)
和前一個不同之處是後面多了一個Factory類型的參數,這意味着ViewModel部分組件是通過工廠設計模式設計的,我們可以通過自定義自己的Factory來生成我們想要的ViewModel。最終我們的調用方式變成了 LifecycleViewModelFactory.newInstance(activity!!.application, this)).get(modelClass)
接下來我們需要先了解一下Android Lifycycles組件的使用
Lifecycle的使用
首先可以確定的是我們需要自定義監聽類並且需要繼承LifecycleObserver
這樣一個接口,你以爲這樣就結束了嗎?不!隨後你會發現這個接口是一個空接口,我們也不需要實現任何方法,那還怎麼感知?別急,查看文檔發現Google告訴我們需要使用註解的方式來實現感知,現在我們可以實現一個簡單的感知類,如:
寫之前的一點準備工作,我們需要在你Project相應的Model模塊下的build.gradle的dependencies下添加相應依賴,如下所示:
dependencies {
···
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
···
}
以下代碼都爲kotlin,不在做提醒
class LifecycleViewModelObserver : LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onAny(source:LifecycleOwner,event:Event) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(source:LifecycleOwner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(source:LifecycleOwner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(source:LifecycleOwner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(source:LifecycleOwner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(source:LifecycleOwner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(source:LifecycleOwner) {
}
}
以上代碼應該應該很好理解了,每一個被@OnLifecycleEvent註解的函數可以有0個或1個參數,第一個參數必須是LifecycleOwner
類型,函數名則不做限制。需要特別之處的是Lifecycle.Event.ON_ANY
,文檔中對它的解釋是在可以匹配所有事件的枚舉常量,被@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
註解的函數可以是0個參數,或2個參數,而不能只有一個,且2個參數按順序類型分別是LifecycleOwner
,Lifecycle.Event
。
文檔中對添加參數的解釋是:
These additional parameters are provided to allow you to conveniently observe multiple providers and events without tracking them manually.
接下來就是怎麼使用我們新建的LifecycleViewModelObserver類了,依然很簡單,如:
添加:lifecycle.addObserver(LifecycleViewModelObserver())
移除:lifecycle.removeObserver(LifecycleViewModelObserver())
在Activity和Fragment中都是同樣的操作。
以上我們應該熟悉了Lifecycles的簡單使用方法。
關於如何定製ViewModel在下一節再做演示。
讓ViewModel也感知Activity(Fragment)的生命週期 #定製屬於自己的ViewModel(二)(未完待續)