Android 架构组件中的 AndroidViewModel 和 ViewModel 有什么区别?

4

我已经在Android架构组件上工作了一段时间,这是在2017年Google IO中推出的。

他们提供了一个组件来避免配置更改问题,即ViewModelAndroidViewModel类。

根据文档:

AndroidViewModel:应用程序上下文感知ViewModel

ViewModel:ViewModel也可以用作Activity的不同片段之间的通信层。每个片段都可以通过其Activity使用相同的键获取ViewModel

但对于AndoirdViewModel场景,我可以通过将类扩展到Application类来获取应用程序上下文

在Android开发中,它们之间的实际区别是什么?因为两者都只与Activity / Fragment生命周期相关联。


你在同一个问题中询问了两件事情,我认为你可以交换标题并将重点放在为什么使用AndroidViewModel而不是扩展Application上。@CommonsWare给出的答案仍然有效。这样,您可以要求删除“重复”的标签,因为创建一个新问题来获得好的答案...我认为这不是一个好主意。 - MiguelHincapieC
1个回答

15

但对于 AndoirdViewModel 场景,我可以通过扩展 Application 类来获取应用程序上下文

创建自定义的 Application 子类并不能使该单例实例在 ViewModel 中自动可用。

可以创建一个自定义的 Application 子类,该子类具有自己的 getInstance() 方法或其他方法以直接公开这个单例。谷歌不喜欢这种模式(事实上,我也不喜欢),因此谷歌不建议开发者使用它。

在 Android 开发中,它们之间的实际区别是什么?

一个 ViewModel 自身没有很好的获取 Context 的方法。AndroidViewModel 提供了一个 Application 作为 Context 使用,并且特别提供了 Application 单例,以确保 Context 本身不会导致内存泄漏。


1
出于好奇,为什么Google(或您)不喜欢具有getInstance()的Application子类? - neteinstein
4
我无法代表Google发表意见。我不是Google的粉丝,因为它使得使用“应用程序(Application)”太容易了,而且很多时候使用“应用程序”作为“上下文(Context)”类型是错误的。 - CommonsWare

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