AndroidViewModel vs ViewModel

随着Android Architecture Components库的引入,引入了几个新类,包括AndroidViewModelViewModel。但是,我很难弄清楚这两个类之间的区别。文档简洁地描述了AndroidViewModel:

应用程序上下文感知ViewModel

我很欣赏你的简洁,但这到底意味着什么?什么时候我们应该选择使用AndroidViewModel而不是ViewModel,反之亦然?

74920 次浏览

AndroidViewModel提供应用程序上下文

如果你需要在你的视图模型中使用上下文,你应该使用AndroidViewModel (AVM),因为它包含了应用程序上下文。要检索上下文调用getApplication(),否则使用常规的ViewModel (VM)。

AndroidViewModel有应用程序上下文。 我们都知道使用静态上下文实例是有害的,因为它会导致内存泄漏!!,但是,拥有静态应用程序实例并不像你想象的那么糟糕,因为在运行的应用程序中只有一个Application实例

因此,在特定的类中使用和拥有Application实例通常不是问题。但是,如果一个应用程序实例引用了它们,由于引用循环问题,这是一个问题。

参见应用实例

单元测试有问题

AVM提供了应用程序上下文,这对于单元测试是有问题的。单元测试不应该处理任何Android生命周期,比如上下文。

最后我得到了一个更简单的解释,有点...... ...AndroidViewModel类是ViewModel的一个子类,与它们类似,它们被设计用来存储和管理ui相关的数据,负责准备&

.为用户界面提供数据,并自动允许数据在配置更改后仍然存在

与AndroidViewModel的唯一区别是它带有应用程序上下文,如果您需要上下文来获得系统服务或有类似的需求,这是很有帮助的。粗体文本使它更清晰地感知它。

AndroidViewModel视图模型的子类。它们之间的区别是我们可以传递应用程序上下文,它可以在任何需要应用程序上下文的时候使用,例如在存储库中实例化数据库。

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 上下文。< / p >

永远不要在ViewModel中存储活动的引用或引用活动的视图。因为ViewModel被设计为比活动更长寿,它会导致内存泄漏。

除了AndroidViewModel给你一个application contextViewModel没有的区别。你必须了解的重要一点是,Google本身建议使用ViewModel而不是AndroidViewModel

所以,除非真的有必要,否则不要使用AndroidViewModel

看这个:谷歌文档