cas*_*cal 127 android mvvm android-architecture-components
随着Android架构组件库的引入,引入了几个新类,包括AndroidViewModel和ViewModel.但是,我无法弄清楚这两个类之间的区别.该文件,简要地描述AndroidViewModel如下:
应用上下文感知
ViewModel
我很欣赏这种简洁,但究竟是什么意思呢?我们什么时候应该选择使用AndroidViewModel,ViewModel反之亦然?
Ale*_*lex 182
如果您需要在viewmodel中使用上下文,则应使用AndroidViewModel,因为它包含应用程序上下文(以检索上下文调用getApplication()),否则使用常规ViewModel.
AndroidViewModel具有应用程序上下文.我们都知道静态Context实例是邪恶的!(可能导致内存泄漏!!)
但是,拥有静态应用程序实例并不比你想象的差
因为,我们正在运行的应用程序中只有一个Application实例.
因此,在特定类中使用&具有Application实例通常不是问题.
但是,如果Application实例引用它们,则由于引用循环问题而存在问题.
小智 18
最后我得到了一个更简单的解释,有点...... ... AndroidViewModel 类是 ViewModel 的子类,与它们类似,它们旨在存储和管理 UI 相关的数据,负责准备和提供数据用于 UI 并自动允许数据在配置更改后继续存在。
与 AndroidViewModel 的唯一区别是它带有应用程序上下文,如果您需要上下文来获取系统服务或有类似的要求,这将很有帮助。粗体文字使您更清楚地感觉到它。
Joh*_*ohn 12
AndroidViewModel是ViewModel 的子类。它们之间的区别在于我们可以传递应用程序上下文,只要需要应用程序上下文就可以使用它,例如在存储库中实例化数据库。
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 被设计为比活动更长的时间,它会导致内存泄漏。