android - ViewModel中查询不需要显示在Activity中的数据
问题描述
我正在使用 Android 的 MVVM架构组件。对于将在View
( Activity
) 中显示的信息,他们建议从 公开 LiveData ViewModel
。Activity 中的Observers
将使用该数据并对它们的更改做出反应。
但是我不知道当您想要获取例如需要进行一些业务验证的信息(可能是数据库中的其他表)时会发生什么。您绝对不想在 UI 中显示该信息,因此为此在 Activity 中包含观察者是没有意义的。
可以observeForever
在 ViewModel 中使用,因此您可以使用不需要在 Activity 中显示的 Repository 中的 LiveData。但是,文档说 ViewModel 不应该包含 LiveData 的观察者。
到目前为止,我找不到任何处理这种情况的好例子。
例子
我有一个 MainActivity 将创建一条Tournament
记录,其中包含用户在屏幕上选择的整数“numberOfRounds”。
现在,在 Activity中,当用户单击“完成当前回合”按钮时PairingsView
,我会显示以下内容:AlertDialog
new AlertDialog.Builder(this)
.setTitle(title)
.setMessage(message)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.continues, (dialogInterface, i) -> {
if (mViewModel.hasNextRond()) {
mViewModel.calculateNewPairings();
}
在视图模型中:
public boolean hasNextRound() {
return currentRound <= numberOfRounds;
}
在这里,我可以访问currentRound
值,因为我Round
在PairingsView
. 但我还需要知道numberOfRounds
是否必须为下一轮生成配对。这个值存储在Tournament
表中,我不需要在我的视图中显示该表中的任何信息,所以我认为我不应该为它包含一个观察者。
解决方案
是的,您可以observeForever
在 ViewModel 中使用,但您应该在 ViewModel 的方法中删除观察者,onCleared
以防止内存泄漏
推荐阅读
- mapbox - Mapbox中两点之间的路由
- php - php,laravel. 如何使用 {!!$data !!} laravel 刀片图像标签中的这个语法
- r - 在进行大量数据操作/清理时,如何最好地在 R 中构建我的代码?
- spring-boot - Spring Boot 中的模块化 @Configuration/@Bean
- git - 如何删除 git 子模块中的提交历史记录?
- java - 从 HDFS 检索作业结果
- apache-spark - Spark drop 重复并选择具有最大值的行
- excel - 基于两列值的VBA条件格式
- java - 计算两个 java.Util.Date 之间的 AGE
- r - R中的逻辑下标太长