让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层的变化可让一些事变的更简单一点。java

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组件的使用android

Lifecycle的使用

首先能够肯定的是咱们须要自定义监听类而且须要继承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(二)(未完待续)

相关文章
相关标签/搜索