讓ViewModel也感知Activity(Fragment)的生命週期 #定製屬於自己的ViewModel(一)

讓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(二)(未完待續)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章