Jetpack组件——ViewModel
文章目录
ViewModel 简介
ViewModel 即是 MVVM 架构中的 VM 部分。ViewModel 专门用于存放应用程序页面所需的数据,它是连接 View 和 Model 的桥梁,使得数据和视图既能够互相分离又能互相通信。
ViewModel 的生命周期
ViewModel 的生命周期如下图所示:
在旋转屏幕的时候,Activity 会经历一次销毁与重新创建的过程,此时原本保存在 Activity 中的数据就会丢失,我们需要考虑此种场景下的数据的储存于恢复问题。但是通过 ViewModel 可以很好的解决这个问题,从上面的 ViewModel 生命周期图可以看到由屏幕旋转导致的 Activity 重建并不会影响 ViewModel 的生命周期。
ViewModel 的使用
1、添加依赖
首先在 app/build.gradle 文件中添加下面的依赖
dependencies{
...
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
}
2、创建 ViewModel
为 Activity 和 Fragment 创建对应的 ViewModel,需要继承 ViewModel 类,示例如下:
class MyViewModel: ViewModel() {
}
3、获取 ViewModel 实例
在 Activity 和 Fragment 中通过 ViewModelProvider 获取 ViewModel 的实例,示例如下:
ViewModelProvider(this).get(MyViewModel::class.java)
说明:
- this 时指 Activity 或者 Fragment 实例
- MyViewModel 即为创建的 ViewModel 类
注:不可以直接创建 ViewModel 的实例,一定要通过 ViewModelProvider 去获取 ViewModel 的实例,因为 ViewModel 有其独立的生命周期,并且其生命周期长于 Activity 的生命周期。
4、向 ViewModel 传递参数
有时候我们需要的创建ViewModel 的时候通过其构造函数来传递一些参数,但是 ViewModel 的实例都是通过 ViewModelProvider 来获取的,我们没有办法直接调用其构造函数来传递参数,因此我们需要借助 ViewModelProvider.Factory 来实现参数传递,示例如下:
修改 MyViewModel 类,添加构造函数:
class MyViewModel(temp: Int): ViewModel() {
}
新建 MyViewModelFactory 类,实现 ViewModelProvider.Factory 接口:
class MyViewModelFactory(private val temp: Int): ViewModelProvider.Factory {
override fun <T: ViewModel> create(modelClass: Class<T>): T{
return MyViewModel(temp) as T
}
}
然后创建实例:
ViewModelProvider(this, MyViewModelFactory(4)).get(MyViewModel::class.java)