Answers:
如果需要在Viewmodel中使用上下文,则应使用AndroidViewModel(AVM),因为它包含应用程序上下文。要检索上下文调用getApplication()
,否则请使用常规的ViewModel(VM)。
AndroidViewModel具有应用程序上下文。我们都知道拥有静态上下文实例是有害的,因为它可能导致内存泄漏!但是,拥有静态Application实例并没有您想像的那么糟糕,因为正在运行的应用程序中只有一个Application实例。
因此,在特定类中使用Application实例并使其具有通常不是问题。但是,如果Application实例引用了它们,则由于引用周期问题而成为问题。
AVM提供了对单元测试有问题的应用程序上下文。单元测试不应处理任何Android生命周期,例如上下文。
ViewModel
仅以指向Application的字段扩展。如果我不需要它,我不喜欢使用带有Application
参数的强制性构造函数(AndroidViewModel
需要),而只使用use ViewModel
。将来需要上下文时,可以轻松地对其进行更改。
ViewModel
时要与片段或共享使用ViewModel
同一活动的不同片段之间。
AndroidViewModel
- Context
依赖-使其无法在常规单元测试中进行测试,而只能进行仪器测试吗?我还没有自己
最后,我得到了一个更简单的解释……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的设计目的是使活动的寿命更长,并且会导致内存泄漏。