Android Viewmodel的内部工作原理是什么,Viewmodel的内部工作。

5

Android Viewmodel 是如何在内部工作的?

当活动被销毁并在设备旋转时重新创建,Viewmodel 如何保存数据?


2个回答

12

查看 ViewModel 的内部工作方式:

View Model:

View Model 是一个生命周期感知的类,旨在存储和管理与 UI 相关的数据。它是 MVVM 架构中的主要组件。当创建 View Model 时,它会存储在 Activity 或 Fragment 管理器中。

好处:

  1. 生命周期感知
  2. 持有和共享 UI 数据
  3. 在旋转中存活并保留数据

这里我们可以提出一个问题:如何在从竖屏旋转到横屏时创建具有相同实例的 View Model?

答案:

要创建 ViewModel 对象,需要使用 ViewModelProvider 类。

ViewModelProvider 是用以下方式创建 viewmodel 实例的实用程序类。

  1. 创建 ViewModelProvider 实例
  2. 从 ViewModelProvider 对象获取所需的 viewmodel

在内部创建 ViewModelProvider 需要两个参数。

  1. ViewModelStoreOwner:它是一个接口。它只有一个方法,返回 ViewModelStore。

  2. 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方法中

enter image description here

该方法获取视图模型类的规范名称,通过附加DEFAULT_KEY创建一个键,然后调用另一个获取函数,该函数获取键和视图模型类引用

enter image description here

此方法首先在viewmodel store中检查viewmodel实例。如果在viewmodelstore中有viewmodel实例,则简单地返回该实例。如果没有viewmodel实例,则使用工厂创建新实例并将该实例保存在viewmodel store中,然后返回viewmodel实例。

此viewmodel store链接到ViewModelStoreOwner,因此我们的activity / fragment具有自己的viewmodel存储。

ViewModelStore是存储viewmodel的对象,并在旋转发生时保留,并返回新activity实例中相同的viewmodel实例。

面试问题:ViewModel存储器链接到活动/片段,当在旋转过程中当前实例被销毁并创建新实例时,该ViewModelStore对象如何保持不变?

让我们了解这个魔法

ViewModelStoreOwner是一个接口。 ComponentActivity实现此接口。

enter image description here

在上面的实现中,我们可以看到,在新的activity对象中,当viewmodel store为null时,它首先检查NonConfigurationInstance,该实例返回以前activity的viewmodelstore。

如果活动是第一次创建,则始终会创建新的viewmodel存储对象。

因此,当旋转发生时,传递给新创建的activity的NonConfigurationInstance对象包含所有与非配置相关的信息,包括旧activity对象的viewmodel store中包含的viewmodel。

答案灵感来自此链接


非常感谢您清晰的解释! - MinYoung Lee

6
Android的ViewModel旨在以这样的方式存储和管理与UI相关的数据,使其能够经受住配置更改(如屏幕旋转)。 ViewModel由先前调用它的活动调用,重复使用该ViewModel对象的实例。但是,如果Activity被销毁或完成,对应的ViewModel将调用onClear()方法来清除资源。这意味着,如果您已将类似于此类的内容添加到ViewModel中:
override fun onClear() {
   super.onClear()
   clearAllLiveDataValues()
   disposeAllVariables() 
}

添加在此处的函数调用将被调用。

Viewmodel 在设备旋转时如何保存数据并在活动销毁和重新创建时恢复数据?

ViewModel 有其自身的lifecycle,可以在屏幕旋转期间恢复其状态和持有的暂时性数据。

注意:ActivityViewModel 的生命周期都是短暂的。不建议允许 ViewModel 在配置更改期间处理关键或敏感数据。

当您需要在特定屏幕或应用程序的某个部分处理关键或敏感数据时,您的应用程序应使用共享偏好设置、安全存储(如果必要)、本地数据库或云存储。

我建议您阅读以下内容:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接