随着Android架构组件库的引入,引入了几个新的类,包括AndroidViewModel和ViewModel。但是,我很难弄清楚这两个类之间的区别。文档对AndroidViewModel的描述如下:
应用程序上下文感知ViewModel
我很欣赏你的简洁,但这到底意味着什么?什么时候我们应该选择使用AndroidViewModel而不是ViewModel,反之亦然?
随着Android架构组件库的引入,引入了几个新的类,包括AndroidViewModel和ViewModel。但是,我很难弄清楚这两个类之间的区别。文档对AndroidViewModel的描述如下:
应用程序上下文感知ViewModel
我很欣赏你的简洁,但这到底意味着什么?什么时候我们应该选择使用AndroidViewModel而不是ViewModel,反之亦然?
当前回答
AndroidViewModel提供应用程序上下文
如果你需要在你的视图模型中使用上下文,你应该使用AndroidViewModel (AVM),因为它包含了应用程序上下文。要检索上下文调用getApplication(),否则使用常规的ViewModel (VM)。
AndroidViewModel有应用程序上下文。 我们都知道静态上下文实例是有害的,因为它会导致内存泄漏!!但是,拥有静态应用程序实例并不像您想象的那么糟糕,因为在运行的应用程序中只有一个应用程序实例。
因此,在特定的类中使用和拥有Application实例通常不是问题。但是,如果一个应用程序实例引用了它们,由于引用循环问题,这是一个问题。
请参见应用实例
单元测试有问题
AVM提供了应用程序上下文,这对于单元测试是有问题的。单元测试不应该处理任何Android生命周期,比如上下文。
其他回答
AndroidViewModel提供应用程序上下文
如果你需要在你的视图模型中使用上下文,你应该使用AndroidViewModel (AVM),因为它包含了应用程序上下文。要检索上下文调用getApplication(),否则使用常规的ViewModel (VM)。
AndroidViewModel有应用程序上下文。 我们都知道静态上下文实例是有害的,因为它会导致内存泄漏!!但是,拥有静态应用程序实例并不像您想象的那么糟糕,因为在运行的应用程序中只有一个应用程序实例。
因此,在特定的类中使用和拥有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();
}
ViewModel:
public class PriceViewModel extends ViewModel {
public PriceViewModel() {
super();
}
你应该使用AndroidViewModel只有当你需要应用程序 上下文。
永远不要在ViewModel中存储活动的引用或引用活动的视图。因为ViewModel被设计为比活动更长寿,它会导致内存泄漏。
除了AndroidViewModel给你一个应用上下文,而ViewModel没有。你必须了解的重要事情是谷歌本身建议使用ViewModel而不是AndroidViewModel。
除非必要,否则不要使用AndroidViewModel。
看这个:谷歌DOC