У меня есть список Functions
, который извлекается из локальной базы данных SQLite с использованием Room, и я хочу наблюдать за каждой функцией в этом списке. На данный момент я делаю следующее:
public List<MutableLiveData<Function>> getLiveFunctions() {
if (liveFunctions == null) {
liveFunctions = new ArrayList<>();
for (Function function : functions) {
//Livedata with a default value on background thread (postValue)
liveFunctions.add(new DefaultLiveData<>(function, true));
}
}
return liveFunctions;
}
После локальной выборки из базы данных я могу запросить состояние данной функции с помощью RPC на моем сервере. Когда я получаю ответ, я могу установить новое значение для этой функции, и я хочу, чтобы мой пользовательский интерфейс наблюдал за изменениями в этой функции.
Просто некоторые уточнения:
Разница между LiveData<List<Function>>>
и List<LiveData<Function>>
заключается в том, что первый будет только наблюдать, был ли объект добавлен, обновлен или удален в списке, правильно? Разве не LiveData<List<Function>>>
тоже слушает изменения своих предметов?
Я использую MediatorLiveData
для объединения моих наблюдателей с «FunctionObserver». Это правильный подход для обработки всех моих функций обратного вызова?
[код]
MediatorLiveData<LiveData<Function>> mediator = new MediatorLiveData<>();
List<MutableLiveData<Function>> functions = //functions
for (LiveData<Function> function : functions) {
mediator.addSource(function, functionObserver);
}
mediator.observe(MainActivity.this, new Observer<LiveData<Function>>() {
@Override
public void onChanged(@Nullable LiveData<Function> functionLiveData) {
Log.i(TAG, "Live data change: ");
}
});
- Можно ли улучшить мою логику кода? Я знаю, что могу запросить
LiveData<List<Function>>>
из комнаты, но у меня возникли проблемы с моим родительским классом, имеющим аннотацию @Relation
, для которой тип должен быть List
или Set
(а не LiveData)