android - 具有多个实时数据对象的活动
问题描述
我的房间数据库中有一张包含卡片列表的表格。我的片段中有 2 个回收站视图。需要根据卡片 ID 填充这些回收站视图。每当此表发生更改时,实时数据都会回调两个回收器视图。相反,我希望如果更新了特定的卡片 d,那么只有实时数据才会更新我的 UI。现在,如果有任何 id 数据正在更新,我会回调两个回收站视图。例如,如果 d 传递的是“Sbi”,那么如果 sbi 数据行发生变化,则只更新第一个回收器视图而不是第二个回收器视图。此外,如果传递的 id 是“sbi”,则暂时忽略其他 id 中的更新。
活动
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.getFirstData("Sbi")).observe(this,
result -> {
myFirstAdapter.addList(result);
});
myViewModel.getSecondData("Sbi1").observe(this,
result -> {
mySecondAdapter.addList(result);
});
}
我的视图模型
public LiveData<List<MyModel>> getFirstData(String cardId) {
return myDao.getItems(cardId);
}
public LiveData<List<MyModel>> getSecondData(String cardDetailId) {
return myDao.getItems(cardDetailId);
}
解决方案
当您将 Room 与 LiveData 一起使用时,Room-framework 会在底层生成一些低级样板代码,这些代码负责在表发生某些变化时调用该神奇的“回调”。它看起来像:
mObserver = new InvalidationTracker.Observer(tableNames) {...
根据文档,此方法“将给定的观察者添加到观察者列表中,如果它观察到的任何表发生变化,它将被通知”。据我了解,Room 不会打开某些“智能模式”,它会在其中分析特定查询的参数(在您的情况下使用“where id:= ...”),并且每当表更改时,它都会调用您的 observe-LiveData-callbacks,无论您在 LiveData 函数中提到什么 id。换句话说,如果您使用 Room,您将在关联的 sqlite-table 中的每次更改时同时提供两个观察回调。
- 如果您的 RecyclerViewAdapter 正在使用DiffUtils(如果不使用,请开始这样做),那么您在定期更新 RecyclerView 时不会遇到任何问题。实际上不会有更新,因为数据列表没有改变。
推荐阅读
- database - 有没有办法在 oracle 数据库中找到长时间运行的程序/包块?
- django - Heroku 自定义域问题
- python - TensorFlow 错误:ValueError:没有为任何变量提供梯度
- c++ - C++ 中的打印堆栈
- json - JSON Schema Draft 7 验证数组对象中所需属性的问题
- r - 为什么我不能在 tsibble 上使用 drop_na?
- java - MyBatis 映射结果到 List
在 MyBatis 存储库中 - rust - 如何在 Tokio 中为 CPU 密集型工作创建专用线程池?
- c++ - 使用 b2 为 ARM 构建 boost 1.66 lib
- google-cloud-platform - 无法解决“错误:Git 服务器扩展不可用”。(谷歌笔记本)