AndroidViewModel与ViewModel

时间:2017-05-24 04:24:20

标签: android mvvm android-architecture-components

随着Android架构组件库的推出,引入了几个新类,包括AndroidViewModelViewModel。但是,我在弄清楚这两个类之间的区别时遇到了麻烦。 documentation简明扼要地描述了AndroidViewModel如下:

  

应用程序上下文感知ViewModel

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

3 个答案:

答案 0 :(得分:139)

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

修改

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

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

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

所以,使用&在特定类中使用Application实例通常不会出现问题。

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

See Also about Application Instance

答案 1 :(得分:4)

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

AndroidViewModel的唯一区别在于应用程序上下文,,如果您需要上下文来获取系统服务或有类似要求,这将很有帮助。粗体字使它更易于理解

答案 2 :(得分:0)

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

  

AndroidViewModel 是可识别应用程序上下文的ViewModel。

AndroidViewModel:

in A.  x: 1 y: 3
in A.  x: 1 y: 2
in A.  x: 1 y: 1
in A.  x: 1 y: 0
in A.  x: 0 y: 1
in A.  x: 0 y: 4
in A.  x: 0 y: 12
in A.  x: 0 y: 28
60

ViewModel:

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}
  

仅在需要应用程序时才应使用 AndroidViewModel   上下文。

您绝不应该在ViewModel中存储活动的引用或引用活动的视图,因为ViewModel的设计目的是使活动寿命更长,并且会导致内存泄漏。