随着Android架构组件库的推出,引入了几个新类,包括AndroidViewModel
和ViewModel
。但是,我在弄清楚这两个类之间的区别时遇到了麻烦。 documentation简明扼要地描述了AndroidViewModel
如下:
应用程序上下文感知
ViewModel
我很欣赏这种简洁,但究竟是什么意思呢?我们应该何时选择使用AndroidViewModel
而不是ViewModel
,反之亦然?
答案 0 :(得分:139)
如果需要在viewmodel中使用上下文,则应使用AndroidViewModel,因为它包含应用程序上下文(用于检索上下文调用getApplication()),否则使用常规ViewModel。
AndroidViewModel具有应用程序上下文。 我们都知道拥有静态上下文实例是邪恶的!(可能导致内存泄漏!!)
但是,拥有静态应用程序实例并不比你想象的差
因为,我们正在运行的应用程序中只有一个Application实例。
所以,使用&在特定类中使用Application实例通常不会出现问题。
但是,如果Application实例引用它们,则由于引用循环问题而存在问题。
答案 1 :(得分:4)
最后,我得到了一些更简单的解释,...... ... AndroidViewModel类是ViewModel的子类,与之相似,它们旨在存储和管理与UI相关的数据,负责为UI准备和提供数据,并自动允许数据在配置更改中幸存。
AndroidViewModel的唯一区别在于应用程序上下文,,如果您需要上下文来获取系统服务或有类似要求,这将很有帮助。粗体字使它更易于理解
答案 2 :(得分:0)
AndroidViewModel 是 ViewModel 的子类。它们之间的区别是我们可以传递应用程序上下文,该上下文可在需要应用程序上下文时使用,例如在存储库中实例化数据库。
AndroidViewModel 是可识别应用程序上下文的ViewModel。
AndroidViewModel:
in A. x: 1 y: 3
in A. x: 1 y: 2
in A. x: 1 y: 1
in A. x: 1 y: 0
in A. x: 0 y: 1
in A. x: 0 y: 4
in A. x: 0 y: 12
in A. x: 0 y: 28
60
ViewModel:
public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;
public PriceViewModel(@NonNull Application application) {
super(application);
priceRepository= new PriceRepository(application);
allPrices = priceRepository.getAllPrices();
}
仅在需要应用程序时才应使用 AndroidViewModel 上下文。
您绝不应该在ViewModel中存储活动的引用或引用活动的视图,因为ViewModel的设计目的是使活动寿命更长,并且会导致内存泄漏。