Живые данные, возвращающие старые значения, onChanged запускается несколько раз - PullRequest
0 голосов
/ 27 февраля 2019

Я использую данные в реальном времени, чтобы обновить вид деятельности.представление содержит номера вопросов, как общее количество вопросов, так и число отвеченных вопросов, например: 2/10 (ответы / всего), вопросы могут быть отфильтрованы с использованием акторов; если актер не выбран, он перечислит все вопросы (рассмотрим общее количество вопросов как 100) затем, если я выбираю какого-либо актера (например, разработчика, HR), общее количество вопросов уменьшается до другого значения, которое меньше 100 (например, 20), общее количество возвращается с использованием метода дао

 @Query("SELECT COUNT(actor) FROM questions WHERE actor IN (:actors)")
    LiveData<Integer> getNumberOfQuestions(String[] actors);

here 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)

в первом случае возвращается 100, а во втором возвращается 100 и 20 Iхотите только текущее значение, т.е. 20, как можно решить это?что я делаю не так?

enter image description here

в представлении модель

 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();
        }
    }

1 Ответ

0 голосов
/ 27 февраля 2019

Сложно понять весь сценарий, но несколько мыслей об этом

Когда вы делаете новый запрос со сменой актера, вы удваиваете (и, возможно, больше) живых запросов.

Итакв результате

  • живой запрос для всех значений
  • живой запрос - значения для указанных акторов
  • и возможные другие прямые запросы

Перед выполнением нового запроса в реальном времени вы можете очистить предыдущий или использовать список вместо 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)
...