随着Android架构组件库的引入,引入了几个新的类,包括AndroidViewModel和ViewModel。但是,我很难弄清楚这两个类之间的区别。文档对AndroidViewModel的描述如下:

应用程序上下文感知ViewModel

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


当前回答

AndroidViewModel提供应用程序上下文

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

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

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

请参见应用实例

单元测试有问题

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

其他回答

除了AndroidViewModel给你一个应用上下文,而ViewModel没有。你必须了解的重要事情是谷歌本身建议使用ViewModel而不是AndroidViewModel。

除非必要,否则不要使用AndroidViewModel。

看这个:谷歌DOC

AndroidViewModel提供应用程序上下文

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

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

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

请参见应用实例

单元测试有问题

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

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的一个子类,与它们类似,它们被设计用来存储和管理UI相关的数据,负责为UI准备和提供数据,并自动允许数据在配置更改后存活。

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