随着Android架构组件库的引入,引入了几个新类,包括AndroidViewModel
和ViewModel
。但是,我很难弄清楚这两个类之间的区别。documentation简洁地描述了AndroidViewModel
,如下所示:
应用程序上下文感知ViewModel
我很欣赏它的简洁,但是这到底意味着什么呢?我们应该在什么时候选择使用AndroidViewModel
而不是ViewModel
,反之亦然?
随着Android架构组件库的引入,引入了几个新类,包括AndroidViewModel
和ViewModel
。但是,我很难弄清楚这两个类之间的区别。documentation简洁地描述了AndroidViewModel
,如下所示:
应用程序上下文感知ViewModel
我很欣赏它的简洁,但是这到底意味着什么呢?我们应该在什么时候选择使用AndroidViewModel
而不是ViewModel
,反之亦然?
4条答案
按热度按时间cig3rfwq1#
AndroidViewModel提供应用程序上下文
如果你需要在ViewModel中使用上下文,你应该使用AndroidViewModel(AVM),因为它包含应用上下文。要检索上下文,请调用
getApplication()
,否则使用常规ViewModel(VM)。AndroidViewModel具有应用程序上下文。我们都知道 * 具有静态上下文示例是有害的,因为它会导致内存泄漏!!* 但是,具有静态应用程序示例并不像您想象的那么糟糕,因为在运行的应用程序中只有一个应用程序示例。
因此,在特定类中使用和拥有Application示例通常不是问题。但是,如果Application示例引用它们,则会因为引用循环问题而成为问题。
See Also about Application Instance
AndroidViewModel单元测试出现问题
AVM提供的应用程序上下文对单元测试来说是个问题。单元测试不应该处理任何Android生命周期,比如上下文。
kq4fsx7k2#
最后,我得到了一个更简单的解释,有点......... AndroidViewModel类是ViewModel的子类,与之类似,它们旨在存储和管理UI相关数据,负责为UI准备和提供数据,并自动允许数据在配置更改后继续存在。
与AndroidViewModel的唯一区别是它附带了应用上下文,**如果您需要上下文来获得系统服务或具有类似需求,这将很有帮助。**粗体文本使其更易于理解。
67up9zun3#
AndroidViewModel是ViewModel的子类。它们之间的区别在于我们可以传递应用程序上下文,该应用程序上下文可在需要应用程序上下文时使用,例如在资料档案库中示例化数据库。
AndroidViewModel是一种应用程序上下文感知ViewModel。
安卓视图型号:
视图模型:
您应该仅在需要应用程序上下文时使用AndroidViewModel。
您永远不应该在ViewModel中储存活动的指涉或指涉活动的检视。因为ViewModel的设计比活动的寿命长,而且会造成内存遗漏。
nom7f22z4#
除了
AndroidViewModel
提供application context
而ViewModel
没有提供application context
的区别之外,您必须了解的重要一点是,Google
本身建议使用ViewModel
而不是AndroidViewModel
。因此,除非确实需要,否则不要使用
AndroidViewModel
。请参见:GOOGLE DOC