随着 Android 架构组件库的引入,引入了几个新类,包括 AndroidViewModel
和 ViewModel
。但是,我无法弄清楚这两个类之间的区别。该 文档 简洁地描述了 AndroidViewModel
如下:
应用上下文感知
ViewModel
我很欣赏简洁,但这到底意味着什么?我们什么时候应该选择使用 AndroidViewModel
而不是 ViewModel
反之亦然?
原文由 cascal 发布,翻译遵循 CC BY-SA 4.0 许可协议
随着 Android 架构组件库的引入,引入了几个新类,包括 AndroidViewModel
和 ViewModel
。但是,我无法弄清楚这两个类之间的区别。该 文档 简洁地描述了 AndroidViewModel
如下:
应用上下文感知
ViewModel
我很欣赏简洁,但这到底意味着什么?我们什么时候应该选择使用 AndroidViewModel
而不是 ViewModel
反之亦然?
原文由 cascal 发布,翻译遵循 CC BY-SA 4.0 许可协议
最后我得到了一个更简单的解释,有点…… …… AndroidViewModel类是ViewModel的子类并且与它们类似,它们旨在存储和管理与UI相关的数据负责准备&提供数据用于 UI 并自动允许数据在配置更改后继续存在。
与 AndroidViewModel 的唯一区别是它带有应用程序上下文, 如果您需要上下文来获取系统服务或有类似的要求,这将很有帮助。 粗体文字让人更清楚地感受到它。
原文由 user9830926 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答798 阅读✓ 已解决
2 回答2.1k 阅读
2 回答929 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
1 回答695 阅读✓ 已解决
2 回答792 阅读
2 回答761 阅读
AndroidViewModel 提供应用上下文
如果您需要在 Viewmodel 中使用上下文,您应该使用 AndroidViewModel (AVM),因为它包含应用程序上下文。要检索上下文调用
getApplication()
,否则使用常规 ViewModel (VM)。AndroidViewModel 有 应用上下文。我们都知道 拥有静态上下文实例是邪恶的,因为它会导致内存泄漏!! 但是, 拥有静态 Application 实例并不像您想象的那么糟糕, 因为在运行的应用程序中只有一个 Application 实例。
因此,在特定类中使用和拥有 Application 实例通常不是问题。但是,如果 Application 实例引用它们,则会因为引用循环问题而出现问题。
另请参阅应用程序实例
AndroidViewModel 单元测试有问题
AVM 提供了应用程序上下文,这对单元测试来说是有问题的。单元测试不应处理任何 Android 生命周期,例如上下文。