MyViewModel
简介
ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。
注意:要将 ViewModel 导入 Android 项目,请参阅 Lifecycle 版本说明中关于声明依赖项的说明。
Android 框架可以管理界面控制器(如 Activity 和 Fragment)的生命周期。Android 框架可能会决定销毁或重新创建界面控制器,以响应完全不受您控制的某些用户操作或设备事件。
如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失。例如,应用的某个 Activity 中可能包含用户列表。因配置更改而重新创建 Activity 后,新 Activity 必须重新提取用户列表。对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。
另一个问题是,界面控制器经常需要进行异步调用,这些调用可能需要一些时间才能返回结果。界面控制器需要管理这些调用,并确保系统在其销毁后清理这些调用以避免潜在的内存泄露。此项管理需要大量的维护工作,并且在因配置更改而重新创建对象的情况下,会造成资源的浪费,因为对象可能需要重新发出已经发出过的调用。
诸如 Activity 和 Fragment 之类的界面控制器主要用于显示界面数据、对用户操作做出响应或处理操作系统通信(如权限请求)。如果要求界面控制器也负责从数据库或网络加载数据,那么会使类越发膨胀。为界面控制器分配过多的责任可能会导致单个类尝试自己处理应用的所有工作,而不是将工作委托给其他类。以这种方式为界面控制器分配过多的责任也会大大增加测试的难度。
从界面控制器逻辑中分离出视图数据所有权的做法更易行且更高效。
创建一个简单的ViewModel
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {//这里用到LiveData的委托和延迟初始化
MutableLiveData().also {
loadUsers()
}
}
fun getUsers(): LiveData<List<User>> {//get函数
return users
}
private fun loadUsers() {//load函数,也就是set函数
// Do an asynchronous operation to fetch users.
}
}
在Activity里面创建
var viewModel = ViewModelProvider(this).get(MyViewModel::class.java);//使用ViewModelProvider函数创建一个实例
MutableLiveData
简介
MutableLiveData是LiveData的子类,LiveData在实体类里可以通知指定某个字段的数据更新.,MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段
创建和初始化
// 延迟初始化
private val title : MutableLiveData<T> by lazy { MutableLiveData<T>().also { it.value = "0" } }
//立即初始化
private val title : MutableLiveData<T>
init {
title .value = 0
}
方法
LiveData赋值有两种方式postValue和setValue获取值则是直接使用getValue(),其实可以直接利用Kotlin的特点直接使用
private val title : MutableLiveData<T>
init {
title .value = 0//这里value就直接作为属性使用
}
添加观察
将一个LiveData和一个对象的生命周期进行绑定,即可在这个对象没有结束生命周期时对内容变化时刻进行操作,通常和Activity 和Fragment 进行绑定,利用observe函数
void observe (LifecycleOwner owner,
Observer<T> observer)
例如
viewModel.get_title().observe(this, Observer { 里面进行操作})//这里this就是一个Activity