226

随着 Android 架构组件库的引入,引入了几个新类,包括AndroidViewModelViewModel. 但是,我无法弄清楚这两个类之间的区别。该文档简洁地描述AndroidViewModel如下:

应用程序上下文感知ViewModel

我很欣赏简洁,但这究竟意味着什么?我们什么时候应该选择使用AndroidViewModelover ViewModel,反之亦然?

4

3 回答 3

286

AndroidViewModel 提供应用程序上下文

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

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

因此,在特定类中使用和拥有 Application 实例通常不是问题。但是,如果 Application 实例引用它们,则由于引用周期问题,这是一个问题。

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

AndroidViewModel 单元测试有问题

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

于 2017-05-24T10:12:55.240 回答
20

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

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

于 2019-12-05T04:11:45.020 回答
15

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

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 旨在延长活动的寿命,并且会导致内存泄漏。

于 2019-12-31T17:42:57.480 回答