AndroidViewModel与ViewModel

cas*_*cal 127 android mvvm android-architecture-components

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

应用上下文感知 ViewModel

我很欣赏这种简洁,但究竟是什么意思呢?我们什么时候应该选择使用AndroidViewModel,ViewModel反之亦然?

Ale*_*lex 182

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

编辑

AndroidViewModel具有应用程序上下文.我们都知道静态Context实例是邪恶的!(可能导致内存泄漏!!)

但是,拥有静态应用程序实例并不比你想象的差

因为,我们正在运行的应用程序中只有一个Application实例.

因此,在特定类中使用&具有Application实例通常不是问题.

但是,如果Application实例引用它们,则由于引用循环问题而存在问题.

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

  • 为什么不总是使用AndroidViewModel呢?即使您现在不需要上下文,也可能稍后需要上下文.那有什么缺点吗? (32认同)
  • @ T.Rex不会使用`AndroidViewModel` - 依赖于"Context" - 让它无法在常规单元测试中进行测试,只留下仪器测试的可能性?我自己还没玩过它,但这只是一个想法 (17认同)
  • @ T.Rex如果查看代码,它只使用指向Application的字段扩展`ViewModel`.如果我不需要它,我不喜欢有一个带有`Application`参数的强制构造函数('AndroidViewModel`需要),而只是使用`ViewModel`.当我将来需要一个上下文时,我可以很容易地改变它. (15认同)
  • 当您想将其与Fragment一起使用或在同一Activity的不同片段之间共享ViewModel时,请使用ViewModel。 (3认同)
  • AndroidViewModel和ViewModel相同,唯一的区别是AndroidViewModel包含应用程序上下文。您可以使用UseViewModel并将上下文传递给ViewModel以实现从MediaStore加载数据的功能,也可以将AndroidViewModel与应用程序上下文一起使用。 (2认同)

小智 18

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

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

  • 官方来源 https://medium.com/androiddevelopers/locale-changes-and-the-androidviewmodel-antipattern-84eb677660d9 (2认同)

Joh*_*ohn 12

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();
}
Run Code Online (Sandbox Code Playgroud)

视图模型:

public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}
Run Code Online (Sandbox Code Playgroud)

只有在需要应用程序上下文时才应该使用AndroidViewModel

你永远不应该在 ViewModel 中存储活动的引用或引用活动的视图。因为 ViewModel 被设计为比活动更长的时间,它会导致内存泄漏。