关于android:AndroidViewModel与ViewModel

AndroidViewModel vs ViewModel

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

Application context aware ViewModel

我很简洁,但是这意味着什么呢? 我们什么时候应该选择在ViewModel上使用AndroidViewModel,反之亦然?


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

编辑

AndroidViewModel具有应用程序上下文。
我们都知道拥有静态上下文实例是邪恶的!(可能导致内存泄漏!)

但是,拥有静态应用程序实例并不像您想象的那样糟糕

因为,我们正在运行的应用程序中只有一个Application实例。

因此,在特定的类中使用并拥有Application实例通常不是问题。

但是,如果应用程序实例引用了它们,则由于引用周期问题而成为问题。

另请参阅有关应用程序实例


终于,我得到了一些更简单的解释,……
... AndroidViewModel类是ViewModel的子类,与之相似,它们旨在存储和管理与UI相关的数据,这些数据负责为UI准备和提供数据,并自动允许数据在配置更改后幸免。

AndroidViewModel的唯一区别是它与应用程序上下文一起提供,如果您需要上下文来获取系统服务或有类似要求,这将很有帮助。粗体字使感觉更清晰。


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

AndroidViewModel is a Application context aware ViewModel.

AndroidViewModel:

1
2
3
4
5
6
7
8
public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}

ViewModel:

1
2
3
4
public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}

You Should use AndroidViewModel only when you require Application
Context.

您绝不应该在ViewModel中存储活动的引用或引用活动的视图,因为ViewModel的设计目的是使活动失效,并且会导致内存泄漏。