Как объединить запросы Retrofit и LocalDB и дать результат RecyclerView в MVVM? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу получить результат от модернизации, если это возможно, отправить эти данные в адаптер повторного просмотра, например, liveata, и сохранить их в локальной БД. Если модификация не может получить данные результатов, она должна загружаться из локальной базы данных. Мой код в MainActivity:

private void initRecyclerView() {

    recyclerView = binding.rvTasks;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    TaskAdapter adapter = new TaskAdapter();
    recyclerView.setAdapter(adapter);

    viewModel.getTasks().observe(this, tasks -> {
        adapter.setTaskCollection(tasks);
    });
}

Затем в MainActivityVeiwModel:

public LiveData<List<Task>> getTasks() {
    return LiveDataReactiveStreams.fromPublisher(retrofitApi.getTasks()
            .subscribeOn(Schedulers.io())
            .doOnError(throwable -> dataStorage.getTaskCollection())
    );

и DataStorage:

public Flowable<List<Task>> getTaskCollection() {
    List<Task> taskList = new ArrayList<>();
    for (Map.Entry<Integer, Task> entry : localDatabase.getTaskCollention().entrySet())
        taskList.add(entry.getValue());
    return Flowable
            .just(taskList);
}

Если сеть подключена, модифицируйте загрузку данных, ноЯ не могу сохранить его подпиской, потому что «LiveDataReactiveStreams не может быть применен к Одноразовому». Если сеть недоступна -> FATAL EXCEPTION: main LiveData не обрабатывает ошибки. Ошибки от издателей должны обрабатываться и распространяться как состояние.

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете напрямую хранить данные в БД. Если вы используете Room (ORM для SQLite), он может генерировать liveata. Вам просто нужно назначить наблюдателя в своей деятельности. Когда БД изменяется, изменения будут автоматически распространяться на ваш пользовательский интерфейс

...