AndroidViewModel
和 ViewModel
。然而,我很难弄清楚这两个类之间的区别。文档 简要地描述了 AndroidViewModel
:
应用程序上下文感知的
ViewModel
我欣赏简洁明了,但这到底意味着什么?我们应该在何时选择使用 AndroidViewModel
而不是 ViewModel
,反之亦然?
AndroidViewModel
和 ViewModel
。然而,我很难弄清楚这两个类之间的区别。文档 简要地描述了 AndroidViewModel
:
应用程序上下文感知的
ViewModel
我欣赏简洁明了,但这到底意味着什么?我们应该在何时选择使用 AndroidViewModel
而不是 ViewModel
,反之亦然?
如果您需要在 Viewmodel 内部使用上下文,则应使用 AndroidViewModel(AVM),因为它包含应用程序上下文。 要检索上下文,请调用 getApplication()
,否则使用常规 ViewModel(VM)。
AndroidViewModel 具有应用程序上下文。我们都知道,具有静态上下文实例是有问题的,因为这可能会导致内存泄漏! 但是,拥有静态 Application 实例并不像您想象的那么糟糕,因为在运行的应用程序中只有一个 Application 实例。
因此,通常情况下,在特定类中使用和拥有 Application 实例并不是问题。 但是,如果 Application 实例引用它们,则存在引用循环问题,这就是问题所在。
AVM 提供了应用程序上下文,这对于单元测试是有问题的。 单元测试不应涉及任何 Android 生命周期,例如上下文。
终于,我得到了一个更简单的解释,稍微...... AndroidViewModel类是ViewModel的子类,与它们相似,都被设计用来存储和管理与UI相关的数据,并负责准备和提供UI所需的数据,自动允许数据在配置更改时保留。
唯一的区别是AndroidViewModel具有应用程序上下文,如果您需要上下文来获取系统服务或具有类似要求,则这非常有帮助。 粗体字使其更加易懂。
AndroidViewModel是ViewModel的一个子类。它们之间的区别在于,我们可以传递应用程序上下文,以便在仓库中实例化数据库等需要应用程序上下文的情况下使用。
AndroidViewModel是一个应用程序上下文感知的ViewModel。
AndroidViewModel:
public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;
public PriceViewModel(@NonNull Application application) {
super(application);
priceRepository= new PriceRepository(application);
allPrices = priceRepository.getAllPrices();
}
视图模型:
public class PriceViewModel extends ViewModel {
public PriceViewModel() {
super();
}
只有在需要应用程序上下文时,您才应该使用 AndroidViewModel 。
您不应该在ViewModel中存储对 Activity 或引用 Activity 的视图的引用。因为 ViewModel 设计的目的是要比 Activity 更长久存在,这会导致内存泄漏。
Application
的值是从哪里传递过来的?它是通过构造函数从另一个类传递过来的吗? - IgorGanapolskyby viewmodel
。请参考ViewModelProvider.Factory
,如何操作。还可以查看其源代码:cs.android.com。 - FalloutBoy除了AndroidViewModel
提供给你一个应用程序上下文(application context)
的区别,而ViewModel
则不提供。你必须理解的重要事情是Google
本身推荐使用ViewModel
而不是AndroidViewModel
。
所以,除非真的有必要,否则不要使用AndroidViewModel
。
查看这个:GOOGLE DOC
Application
参数(这是AndroidViewModel
所要求的),而是更愿意只使用ViewModel
。当我将来需要上下文时,我可以轻松地进行更改。 - BoyViewModel
。 - codelearnerAndroidViewModel
会依赖于Context
,这会导致无法在普通的单元测试中进行测试,只能使用仪器化测试。我还没有亲自尝试过,这只是一个想法。 - Konrad Morawski