Android 推出了他的Jetpack組件讓Android開發者來快速構建Android App,其中就包括ViewModel,Lifecycles,LiveData。
ViewModel被用來存儲View的狀態,以及View相關的數據;Lifecycles被用來感知Activity或Fragment的生命週期;LiveData能夠在數據集發生變化的同時通知UI(即View)作出相應改變。
LiveData在這裏咱們能夠用RxJava2代替,理論上ViewModel是不須要感知UI層的生命週期變化的,但咱們須要在UI狀態發生變化的時候作一些相應的事情,因此讓ViewModel能夠感知到UI層的變化可讓一些事變的更簡單一點。java
通常得到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組件的使用android
首先能夠肯定的是咱們須要自定義監聽類而且須要繼承LifecycleObserver
這樣一個接口,你覺得這樣就結束了嗎?不!隨後你會發現這個接口是一個空接口,咱們也不須要實現任何方法,那還怎麼感知?別急,查看文檔發現Google告訴咱們須要使用註解的方式來實現感知,如今咱們能夠實現一個簡單的感知類,如:設計模式
寫以前的一點準備工做,咱們須要在你Project相應的Model模塊下的build.gradle的dependencies下添加相應依賴,以下所示:app
dependencies { ··· implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' ··· }
如下代碼都爲kotlin,不在作提醒ide
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
。函數
文檔中對添加參數的解釋是:gradle
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中都是一樣的操做。ui
以上咱們應該熟悉了Lifecycles的簡單使用方法。this
關於如何定製ViewModel在下一節再作演示。設計
讓ViewModel也感知Activity(Fragment)的生命週期 #定製屬於本身的ViewModel(二)(未完待續)