首页 > 解决方案 > 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值,因为我RoundPairingsView. 但我还需要知道numberOfRounds是否必须为下一轮生成配对。这个值存储在Tournament表中,我不需要在我的视图中显示该表中的任何信息,所以我认为我不应该为它包含一个观察者。

标签: androidandroid-livedataandroid-architecture-components

解决方案


是的,您可以observeForever在 ViewModel 中使用,但您应该在 ViewModel 的方法中删除观察者,onCleared以防止内存泄漏


推荐阅读