Android ViewModel 是 Android 架构组件的一部分,主要用于存储和管理与 UI 相关的数据,使数据能够在配置变化(如屏幕旋转)时得以保存。下面是 ViewModel 的工作原理:
-
生命周期感知:ViewModel 是生命周期感知型组件,不会因 UI 控件的生命周期变化(如 Activity 重建)而销毁。它的生命周期与其关联的
ViewModelStoreOwner
(通常是 Activity 或 Fragment)相同。 -
数据持久化:当 Activity 或 Fragment 重新创建时,如在屏幕旋转时,ViewModel 不会被销毁,因此它所持有的数据也不会丢失。ViewModel 的实例只会在
ViewModelStoreOwner
被彻底销毁时(如 Activity 被彻底退出或 Fragment 被移除)才会被清理。 -
数据与 UI 分离:ViewModel 将数据与 UI 控件分离,确保数据逻辑和 UI 逻辑的分离,这有助于提升代码的可维护性和测试性。
-
LiveData 支持:通常,ViewModel 与 LiveData 一起使用。LiveData 是一个可观察的数据持有类,它与 ViewModel 结合使用,可以帮助开发者实现数据变化的自动通知和 UI 的更新。
基本使用方法
-
定义 ViewModel:
class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> get() = _data fun loadData() { // 加载数据并更新 _data _data.value = "新数据" } }
-
在 Activity 或 Fragment 中使用 ViewModel:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.data.observe(this, Observer { data -> // 更新 UI findViewById<TextView>(R.id.textView).text = data }) viewModel.loadData() } }
原理详解
-
ViewModelProvider:这是一个工厂类,用于创建 ViewModel 实例。它确保在配置变化时返回同一个 ViewModel 实例。
ViewModelProvider(this).get(MyViewModel::class.java)
-
ViewModelStore:每个
ViewModelStoreOwner
(如 Activity 或 Fragment)都有一个 ViewModelStore,用于存储 ViewModel 实例。在配置变化时,新创建的ViewModelStoreOwner
会接管旧的 ViewModelStore,从而实现 ViewModel 的持久化。 -
LiveData:LiveData 是一个持有可观察数据的容器类。当数据发生变化时,它会通知所有的观察者(通常是 UI 控件),从而实现数据驱动的 UI 更新。
通过上述机制,Android ViewModel 实现了数据的持久化和与 UI 的解耦,有效提升了应用的稳定性和可维护性。