android - 为什么我们在 Android 的构造函数中使用应用程序上下文?
问题描述
在使用 Room Database 时,我发现 Repository 和 ViewModel 等类在其构造函数中使用应用程序上下文作为参数。
我只想知道原因,为什么这样做?使用应用程序上下文是一种强制吗?
public WordViewModel (Application application) {
super(application);
mRepository = new WordRepository(application);
mAllWords = mRepository.getAllWords();
}
WordRepository(Application application) {
WordRoomDatabase db = WordRoomDatabase.getDatabase(application);
mWordDao = db.wordDao();
mAllWords = mWordDao.getAllWords();
}
想知道这些东西背后的原因
解决方案
- 为什么我们不能使用活动上下文?
注意:ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。
ViewModel 对象旨在比视图或 LifecycleOwners 的特定实例更长寿。这种设计还意味着您可以更轻松地编写测试来覆盖 ViewModel,因为它不了解视图和生命周期对象。
- 为什么我们可以使用应用程序上下文?
如果 ViewModel 需要 Application 上下文,例如查找系统服务,它可以扩展 AndroidViewModel 类,并在构造函数中有一个接收 Application 的构造函数,因为 Application 类扩展了 Context。
查看视图模型
推荐阅读
- assembly - Assembly `push`、`pop`、`call` 和 `ret` 操作的幕后究竟发生了什么?
- javascript - 如何使用 javascript 验证表单电子邮件地址?
- forms - 同一页面中的两个表单
- ios - Swift - 自动订购 UITableView
- javascript - 不要在特定输入上做某事
- powerbi - 由 VAR 定义的 DAX 变量产生不同的结果,然后 CALCULATE
- javascript - $ 表示法访问基类类的属性
- python - 如何在 Python 中跟踪打开文件/文件描述符的总数
- vue.js - 在 Vue 上构建产品后更改 css 中的 url 路径
- javascript - 给定一组 uid,如何在 React Native 中返回 Firebase 数据的 JavaScript 对象?