一、ViewModel
ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。
1.1 简单实现
class MyViewModel : ViewModel() {
val users = MutableLiveData<List<User>>()
fun loadUsers() {
// 执行异步操作以获取用户列表
users.value = userDao.getUsers()
}
}
注意:ViewModel 绝不能引用视图、Lifecycle 或可能存储对 Activity 上下文的引用的任何类。
可以从 Activity 访问该列表,如下所示:
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Use the 'by viewModels()' Kotlin property delegate
// from the activity-ktx artifact
val viewModel: MyViewModel by viewModels()
//val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.loadUsers()
viewModel.users.observe(this, Observer<List<User>>{
users ->
// update UI
})
}
}
部分代码用到了Android KTX
1.2 ViewModel 的生命周期
ViewModel
对象存在的时间范围是获取 ViewModel
时传递给 ViewModelProvider
的 Lifecycle
。ViewModel 将一直留在内存中,直到限定其存在时间范围的 Lifecycle
永久消失:对于 Activity,是在 Activity 完成时;而对于 Fragment,是在 Fragment 分离时。
通常在系统首次调用 Activity 对象的 onCreate()
方法时请求 ViewModel
。系统可能会在 Activity 的整个生命周期内多次调用 onCreate()
,如在旋转设备屏幕时。ViewModel
存在的时间范围是从您首次请求 ViewModel
直到 Activity 完成并销毁。
1.3 在 Fragment 之间共享数据
Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的情况。我们可以利用ViewModel实现Activity 中多个Fragment 共享数据。这多个 Fragment 可以使用其 Activity 范围共享 ViewModel 来处理此类通信,如以下示例代码所示:
cl