首页 > 解决方案 > 实时数据返回旧值,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));

            }
        });

我正在观察计数,但考虑一下场景

  1. 未应用过滤器(未选择演员,计数 =100)
  2. 演员开发者被选中(计数 = 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();
        }
    }

标签: androiddaoandroid-roomandroid-livedataandroid-database

解决方案


很难知道整个场景,但我对此有一些想法

当您通过参与者更改提出新请求时,您会加倍(甚至更多)实时请求。

所以结果,

  • 实时查询适用于所有值
  • 实时查询是指定参与者的值
  • 以及可能的其他实时查询

在发出新的实时请求之前,您可以清除之前的请求,或者您可以使用 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)

推荐阅读