android - 实时数据返回旧值,onChanged 多次触发
问题描述
我正在使用实时数据来更新活动的一些视图。该视图包含问题编号,包括总问题编号和已回答问题编号,例如:2/10(已回答/总数)可以使用演员过滤问题,如果没有选择演员,那么它将列出所有问题(考虑总问题数为 100 ) 然后,如果我选择任何演员(如开发人员、HR),那么问题总数将减少到另一个小于 100 的值(如 20 ),使用 dao 方法返回总计数
@Query("SELECT COUNT(actor) FROM questions WHERE actor IN (:actors)")
LiveData<Integer> getNumberOfQuestions(String[] actors);
这里 String[] 演员是选择的演员列表
使用观察者
questionsViewModel.getTotalQuestionCount(mCheckedActorList).observe(this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer countTotal) {
if (countTotal != null)
mTotalCount = String.valueOf(countTotal);
if (mAnswerCount != null && mTotalCount != null)
mAllQuestionAnswered.setText(mAnswerCount.concat("/").concat(mTotalCount));
}
});
我正在观察计数,但考虑一下场景
- 未应用过滤器(未选择演员,计数 =100)
- 演员开发者被选中(计数 = 20)
onchanged 在第一种情况下返回 100,在第二种情况下返回 100 和 20 我只想要当前值,即 20 如何解决这个问题?我究竟做错了什么?
在视图模型中
public LiveData<Integer> getTotalQuestionCount(List<String> actorsList) {
if (actorsList != null && actorsList.size() > 0) {
String[] actorArray = new String[actorsList.size()];
actorArray = actorsList.toArray(actorArray);
return questionsRepository.getTotalCount(actorArray);
} else {
return questionsRepository.getTotalCount();
}
}
解决方案
很难知道整个场景,但我对此有一些想法
当您通过参与者更改提出新请求时,您会加倍(甚至更多)实时请求。
所以结果,
- 实时查询适用于所有值
- 实时查询是指定参与者的值
- 以及可能的其他实时查询
在发出新的实时请求之前,您可以清除之前的请求,或者您可以使用 List 代替 LiveData。
清除实时查询观察者的示例用法,
持有 LiveData 和 Observer
Observer<Integer> observerOfLiveQuery = new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer countTotal) {
if (countTotal != null)
mTotalCount = String.valueOf(countTotal);
if (mAnswerCount != null && mTotalCount != null)
mAllQuestionAnswered.setText(mAnswerCount.concat("/").concat(mTotalCount));
}
}
LiveData<Intener> firstLiveQuery = getTotalQuestionCount(...)
firstLiveQuery.observe(this, observerOfLiveQuery)
LiveData<Intener> secondLiveQuery = getTotalQuestionCount(...)
firstLiveQuery.removeObserver(observerOfLiveQuery)
secondLiveQuery.observe(this, observerOfLiveQuery)
推荐阅读
- python - 在 tensorflow 中加载 3D 卷,然后打乱数据
- shell - 无法退出循环
- python-3.x - 递归遍历嵌套字典并返回第一个匹配键的值
- performance - 汇编 - 如何通过延迟和吞吐量对 CPU 指令进行评分
- jira - 如何通过 jira rest api 从特定的未发布版本中获取所有问题
- sd-card - CRC CMD18 SD 卡
- javascript - 如何在 electronjs 中添加谷歌地图和一些坐标
- vb.net - Visual Studio 调试 VB.Net Web 窗体应用程序将 Locals 显示为忙碌...然后挂起
- redirect - Identity Server 4 - 检查 iframe 会话问题 - oidc 客户端
- c - 是 P1DIR |= (BIT0 | BIT6); 和 P1DIR |= BIT0 + BIT6; 相同的表达方式?