深入解读 ViewModel 源码:揭秘数据绑定背后的机制
2023-09-03 12:58:50
前言
ViewModel 是 Android 架构组件中不可或缺的一部分,它负责在数据绑定和 UI 组件之间架起桥梁,确保数据的持久性和生命周期安全。要想深入理解数据绑定的机制,深入研究 ViewModel 的源码必不可少。本文将带你踏上这趟源码探索之旅,逐一揭开 ViewModel 的工作原理。
ViewModelProvider
ViewModelProvider 是一个工厂类,负责创建和获取 ViewModel 实例。它通过一个泛型参数指定要创建的 ViewModel 类,并通过 ViewModelStore 存储已创建的 ViewModel 实例。
class ViewModelProvider(private val viewModelStore: ViewModelStore) {
fun <T : ViewModel> get(modelClass: Class<T>): T {
...
}
...
}
ViewModelStore
ViewModelStore 是一个键值对存储,用于存储 ViewModel 实例。它使用 ViewModel 的类名作为键,ViewModel 实例作为值。这确保了在同一个作用域内,同一类 ViewModel 只会创建一次。
class ViewModelStore {
private val viewModels = mutableMapOf<String, ViewModel>()
fun <T : ViewModel> get(modelClass: Class<T>): T? {
...
}
...
}
ViewModel 的创建
当我们使用 ViewModelProvider 获取 ViewModel 实例时,它会先检查 ViewModelStore 中是否已经存在该类型的 ViewModel。如果不存在,则会创建一个新的 ViewModel 实例并将其存储在 ViewModelStore 中。
fun <T : ViewModel> get(modelClass: Class<T>): T {
val viewModel = viewModelStore.get(modelClass)
if (viewModel == null) {
viewModel = modelClass.newInstance()
viewModelStore.put(modelClass, viewModel)
}
return viewModel
}
ViewModel 的生命周期
ViewModel 的生命周期与它所属的 Activity 或 Fragment 相关联。当 Activity 或 Fragment 被创建时,ViewModel 也随之创建。当 Activity 或 Fragment 被销毁时,ViewModel 也会被销毁。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = ViewModelProvider(this).get(MyViewModel::class.java);
}
@Override
protected void onDestroy() {
super.onDestroy();
viewModelStore.clear();
}
数据绑定的机制
数据绑定是通过观察者模式实现的。ViewModel 作为被观察者,UI 组件作为观察者。当 ViewModel 中的数据发生改变时,它会通知观察者更新 UI。
class MyViewModel : ViewModel() {
private val _count = MutableLiveData<Int>()
val count: LiveData<Int> = _count
fun incrementCount() {
_count.value = _count.value?.plus(1) ?: 0
}
...
}
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.count}" />
内存优化
ViewModel 的内存优化主要是通过缓存 ViewModel 实例来实现的。当 Activity 或 Fragment 被销毁时,ViewModel 不会被销毁,而是被缓存起来。当 Activity 或 Fragment 再次创建时,缓存的 ViewModel 会被重新使用,从而避免了重复创建 ViewModel。
class ActivityViewModelFactory(private val viewModelStore: ViewModelStore) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val viewModel = viewModelStore.get(modelClass)
if (viewModel != null) {
return viewModel
}
return modelClass.newInstance()
}
...
}
总结
通过探索 ViewModel 的源码,我们深入了解了它在数据绑定中的作用以及如何管理其生命周期。ViewModelProvider 和 ViewModelStore 协同工作,确保 ViewModel 实例的创建和缓存。数据绑定通过观察者模式实现了数据和 UI 之间的双向绑定。同时,ViewModel 还通过缓存机制进行了内存优化。
理解了 ViewModel 的工作原理,你将能够在开发 Android 应用时更加高效地利用它,创建更强大、更易维护的数据绑定解决方案。