Что вызывает LiveData onChanged ()? - PullRequest
0 голосов
/ 25 ноября 2018

Я использую Room и в Dao у меня есть этот метод:

LiveData<List<Books>> getAllBooks();

В MainActivity я подписался на этот метод из ViewModel.Изменения в данных вызывают обратный вызов onChanged():

    viewModel.getAllBooks()
            .observe(this, books -> {
                Log.d(TAG, "onChanged()");
                booksListAdapter.setData(new ArrayList<>(books));
            });

Что я хотел бы знать, что представляет собой обновление?При первом запуске приложения я делаю 100 вставок, каждая из которых меняет базу данных, но onChanged() не вызывается 100 раз.В прошлый раз, когда я проверил, он вызвал onChanged() в первый раз, который, я думаю, всегда вызывает при запуске, а затем еще два вызова.

Могу ли я контролировать это?Например, если я знаю, что я буду делать 100 вставок, возможно, было бы лучше, если бы я получил обратный вызов только в конце вставок.

1 Ответ

0 голосов
/ 26 ноября 2018

Вы не можете это контролировать.Что вы можете сделать, это использовать MediatorLiveData и опубликовать значение после всех вставок.Всякий раз, когда вы обновляете, удаляете или вставляете Room, он знает, что произошли изменения, но не знает, что было изменено.Так что он просто повторно запрашивает и отправляет результаты наблюдения LiveData

Проверьте этот блог и в основном раздел 7.Избегайте ложных положительных уведомлений для наблюдаемых запросов .Автор приводит довольно хороший пример MediatorLiveData, который похож на то, что вы ищете

...