Наблюдатель на LiveData все еще активен после removeObservers - PullRequest
0 голосов
/ 12 февраля 2020

Я выбираю информацию из БД с помощью LiveData, передавая ее в свою активность (через DAO, Repository & Viewmodel) в зависимости от временного интервала дат. Когда я изменяю временной интервал, я хочу удалить старых наблюдателей из LiveData и создать новый наблюдатель для нового промежутка времени.

private void addStepsObserver(Date[] timeSpan) {
    homeViewModel.getSteps(timeSpan[0], timeSpan[1]).observe(this, new Observer<Integer>() {
        @Override
        public void onChanged(Integer integer) {
            if (integer == null) {
                return;
            }
            Log.i(StepRepository.TAG, "onChanged for getSteps().observe called " + integer);
            updateStepCounter(integer);
        }
    });
}

private void removeObservers() {
    Date[] timeSpan = homeViewModel.getCurrentTimespan();
    homeViewModel.getSteps(timeSpan[0], timeSpan[1]).removeObservers(this);
    Log.i(TAG, "remove Observers " + timeSpan[0] + " " + timeSpan[1]);
}

Однако после того, как я вызову removeObservers(), а затем addStepsObservers(timespan) с указанием временного промежутка другая отметка времени, чем раньше, метод updateStepCounter() вызывается обоими наблюдателями, хотя старая уже не активна (я проверил это, используя .hasObservers() и .hasActiveObservers())

Любые советы?

1 Ответ

0 голосов
/ 12 февраля 2020

homeViewModel.getSteps() - возвращает новый LiveData для каждого звонка? Таким образом, это означает, что вы удаляете наблюдателя из другого вновь созданного LiveData. Вы должны сохранить ссылку на LiveData объект, созданный на шаге addStepsObserver, а на шаге removeObservers вы должны удалить наблюдателей из него.

...