AndroidViewModel 与 ViewModel

AndroidViewModel vs ViewModel

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

Application context aware ViewModel

我很欣赏简洁,但这到底意味着什么?我们什么时候应该选择使用 AndroidViewModel 而不是 ViewModel,反之亦然?

AndroidViewModel 提供应用上下文

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

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

因此,在特定 class 中使用和拥有 Application 实例通常不是问题。但是,如果一个 Application 实例引用它们,就会出现引用循环问题。

See Also about Application Instance

AndroidViewModel 单元测试有问题

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

终于得到更简单的解释了,有点…… ...AndroidViewModel class 是 ViewModel 的子class 和它们类似,它们被设计用来存储和管理 UI - 相关数据负责为 [= 准备和提供数据17=] 并自动允许数据在配置更改后继续存在。

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

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

AndroidViewModel is a Application context aware 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();
}

You Should use AndroidViewModel only when you require Application Context.

您永远不应在 ViewModel.Because 中存储 activity 的引用或引用 activity 的视图 ViewModel 的设计寿命比 activity 长,这会导致内存泄漏。