让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(二)(未完待续)

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