返回

深入解读 ViewModel 源码:揭秘数据绑定背后的机制

Android

前言

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 应用时更加高效地利用它,创建更强大、更易维护的数据绑定解决方案。