让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(二)(未完待续)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。