Android Viewmodel 是如何在内部工作的?
当活动被销毁并在设备旋转时重新创建,Viewmodel 如何保存数据?
Android Viewmodel 是如何在内部工作的?
当活动被销毁并在设备旋转时重新创建,Viewmodel 如何保存数据?
View Model:
View Model 是一个生命周期感知的类,旨在存储和管理与 UI 相关的数据。它是 MVVM 架构中的主要组件。当创建 View Model 时,它会存储在 Activity 或 Fragment 管理器中。
好处:
这里我们可以提出一个问题:如何在从竖屏旋转到横屏时创建具有相同实例的 View Model?
答案:
要创建 ViewModel 对象,需要使用 ViewModelProvider 类。
ViewModelProvider 是用以下方式创建 viewmodel 实例的实用程序类。
在内部创建 ViewModelProvider 需要两个参数。
ViewModelStoreOwner:它是一个接口。它只有一个方法,返回 ViewModelStore。
Factory:它是 ViewModelProvider 类中的嵌套接口,用于制造 viewmodel 对象。
val viewModelProvider = ViewModelProvider(this)
val viewModelProvider2 = ViewModelProvider(this,viewModelFactory)
如果工厂未通过,则会创建默认工厂。可以为参数化的视图模型创建自定义工厂。
因此,现在我们有了视图模型提供程序的实例,现在让我们获取我们的视图模型对象。
val viewModelProvider = ViewModelProvider(this)
val viewModel = viewModelProvider.get(LoginViewModel::class.java)
正如我们所看到的,我们只需使用所需的ViewModel类引用调用get(arg)方法,即可创建我们的ViewModel对象。
因此,所有魔法都发生在这个get方法中
该方法获取视图模型类的规范名称,通过附加DEFAULT_KEY创建一个键,然后调用另一个获取函数,该函数获取键和视图模型类引用
此方法首先在viewmodel store中检查viewmodel实例。如果在viewmodelstore中有viewmodel实例,则简单地返回该实例。如果没有viewmodel实例,则使用工厂创建新实例并将该实例保存在viewmodel store中,然后返回viewmodel实例。
此viewmodel store链接到ViewModelStoreOwner,因此我们的activity / fragment具有自己的viewmodel存储。
ViewModelStore是存储viewmodel的对象,并在旋转发生时保留,并返回新activity实例中相同的viewmodel实例。
面试问题:ViewModel存储器链接到活动/片段,当在旋转过程中当前实例被销毁并创建新实例时,该ViewModelStore对象如何保持不变?
让我们了解这个魔法
ViewModelStoreOwner是一个接口。 ComponentActivity实现此接口。
在上面的实现中,我们可以看到,在新的activity对象中,当viewmodel store为null时,它首先检查NonConfigurationInstance,该实例返回以前activity的viewmodelstore。
如果活动是第一次创建,则始终会创建新的viewmodel存储对象。
因此,当旋转发生时,传递给新创建的activity的NonConfigurationInstance对象包含所有与非配置相关的信息,包括旧activity对象的viewmodel store中包含的viewmodel。
答案灵感来自此链接
ViewModel
旨在以这样的方式存储和管理与UI相关的数据,使其能够经受住配置更改(如屏幕旋转)。
ViewModel
由先前调用它的活动调用,重复使用该ViewModel
对象的实例。但是,如果Activity
被销毁或完成,对应的ViewModel
将调用onClear()
方法来清除资源。这意味着,如果您已将类似于此类的内容添加到ViewModel
中:override fun onClear() {
super.onClear()
clearAllLiveDataValues()
disposeAllVariables()
}
添加在此处的函数调用将被调用。
Viewmodel 在设备旋转时如何保存数据并在活动销毁和重新创建时恢复数据?
ViewModel
有其自身的lifecycle,可以在屏幕旋转期间恢复其状态和持有的暂时性数据。
注意:
Activity
和ViewModel
的生命周期都是短暂的。不建议允许ViewModel
在配置更改期间处理关键或敏感数据。
当您需要在特定屏幕或应用程序的某个部分处理关键或敏感数据时,您的应用程序应使用共享偏好设置、安全存储(如果必要)、本地数据库或云存储。
我建议您阅读以下内容: