随着 Android 架构组件库的引入,引入了几个新类,包括AndroidViewModel
和ViewModel
. 但是,我无法弄清楚这两个类之间的区别。该文档简洁地描述AndroidViewModel
如下:
应用程序上下文感知
ViewModel
我很欣赏简洁,但这究竟意味着什么?我们什么时候应该选择使用AndroidViewModel
over ViewModel
,反之亦然?
随着 Android 架构组件库的引入,引入了几个新类,包括AndroidViewModel
和ViewModel
. 但是,我无法弄清楚这两个类之间的区别。该文档简洁地描述AndroidViewModel
如下:
应用程序上下文感知
ViewModel
我很欣赏简洁,但这究竟意味着什么?我们什么时候应该选择使用AndroidViewModel
over ViewModel
,反之亦然?
如果您需要在 Viewmodel 中使用上下文,您应该使用 AndroidViewModel (AVM),因为它包含应用程序上下文。要检索上下文调用getApplication()
,否则使用常规 ViewModel (VM)。
AndroidViewModel 具有应用程序上下文。我们都知道拥有静态上下文实例是邪恶的,因为它会导致内存泄漏!但是,拥有静态应用程序实例并不像您想象的那么糟糕,因为正在运行的应用程序中只有一个应用程序实例。
因此,在特定类中使用和拥有 Application 实例通常不是问题。但是,如果 Application 实例引用它们,则由于引用周期问题,这是一个问题。
AVM 提供了对单元测试有问题的应用程序上下文。单元测试不应处理任何 Android 生命周期,例如上下文。
终于得到了一个更简单的解释,有点............AndroidViewModel 类是 ViewModel 的子类,与它们类似,它们旨在存储和管理与 UI 相关的数据,负责准备和提供数据用于 UI 并自动允许数据在配置更改后继续存在。
与 AndroidViewModel 的唯一区别是它带有应用程序上下文,如果您需要上下文来获取系统服务或有类似要求,这将很有帮助。粗体字让人更清楚地感觉到它。
AndroidViewModel是ViewModel的子类。它们之间的区别在于我们可以传递应用程序上下文,它可以在需要应用程序上下文时使用,例如在存储库中实例化数据库。
AndroidViewModel是一个应用程序上下文感知的 ViewModel。
安卓视图模型:
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 。
您永远不应该在 ViewModel 中存储活动的引用或引用活动的视图。因为 ViewModel 旨在延长活动的寿命,并且会导致内存泄漏。