AndroidViewModel与ViewModel


158

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

应用程序上下文感知 ViewModel

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

Answers:


223

AndroidViewModel提供应用程序上下文

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

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

因此,在特定类中使用Application实例并使其具有通常不是问题。但是,如果Application实例引用了它们,则由于引用周期问题而成为问题。

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

AndroidViewModel对单元测试有问题

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


40
为什么不总是使用AndroidViewModel呢?即使您现在不需要它,您以后也可能需要它。那有什么缺点吗?
T. Rex

19
@ T.Rex如果您查看代码,则它ViewModel仅以指向Application的字段扩展。如果我不需要它,我不喜欢使用带有Application参数的强制性构造函数(AndroidViewModel需要),而只使用use ViewModel。将来需要上下文时,可以轻松地对其进行更改。
男孩

3
使用ViewModel时要与片段或共享使用ViewModel同一活动的不同片段之间。
codelearner18年

22
@ T.Rex不会使用AndroidViewModel- Context依赖-使其无法在常规单元测试中进行测试,而只能进行仪器测试吗?我还没有自己
开玩笑

2
AndroidViewModel和ViewModel相同,唯一的区别是AndroidViewModel包含应用程序上下文。您可以使用UseViewModel并将上下文传递给ViewModel以实现从MediaStore加载数据的功能,也可以将AndroidViewModel与应用程序上下文一起使用。
亚历克斯

9

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

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



4

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

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的设计目的是使活动的寿命更长,并且会导致内存泄漏。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.