Вы должны получить эти данные в ViewModel
, обработать данные и предоставить этому экземпляру ViewModel
общий доступ к Fragments
.Проверьте эту часть руководства ViewModel, чтобы увидеть, как разделить ViewModels
между фрагментами.
Что, если я хотел использовать LiveDataдля этого я должен зарегистрировать наблюдателя в VIewModel, вычислить там все в onChanged и создать из него другие LiveData из ViewModel и позволить фрагментам прослушивать эти новые LiveData?
Нет.Вместо этого зарегистрируйте наблюдателя в ViewModel, используя LiveData.observeForever
.
ExampleViewModel
class ExampleViewModel extends ViewModel {
private final LiveData<Data> myLiveData;
private final Observer<Data> myObserver;
ExampleViewModel() {
// Step 1: get LiveData and instantiate observer
myLiveData = myRepository.getMyData();
myObserver = (data) -> {...};
// Step 2: use observeForever to observe the LiveData
myLiveData.observeForever(myObserver);
}
@Override
void onCleared () {
// Step 3: remove observer
myLiveData.removeObserver(myObserver);
}
}
, если я в конечном итоге используюLiveData и я не знаю, сколько будет категорий, слушаю ли я все записи в таблице и заново вычисляю все, как только обнаружены изменения, или я создаю разных слушателей на основе "... WHERE CategoryID = :categoryID"
, чтобы избежать повторного вычислениявсе, когда была добавлена только одна запись категории?
Комната знает, когда таблица изменяется, но не знает, как таблица изменилась, поэтому она пересчитает все, даже если вы укажете categoryID в запросе, и эта конкретная категория не изменилась.Создание разных слушателей для каждой категории не уменьшит стоимость вычислений, а только усложнит вашу логику.Вместо этого вы должны слушать всю таблицу, или, если вычисления слишком тяжелые, не используйте LiveData
и не выполняйте однократный поиск.