Я пытаюсь использовать RxJava с Android для асинхронного обновления моего представления.Когда пользователь щелкает фильм из списка в RecyclerView, я хочу сначала представить ему фильм из базы данных, если он есть.Затем я хочу получить последнюю информацию и обновить базу данных, а также пользовательский интерфейс.Я пытаюсь использовать метод concat
и его вариант, но он не работает.
Я пропустил другие коды только для публикации соответствующих методов RxJava, которые извлекают данные, поскольку остальное работает нормально.
Когда я отключаю сетевое соединение с помощью приведенного ниже кода (следовательно, удаленное возвращает ошибку), приведенный ниже код вообще не отображает данные из базы данных.Только он сообщает об ошибке.Это означает, что локальный не разрешается.
public Flowable<Movie> getMovie(final int id) {
return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
mLocal.save(data);
})).onErrorResumeNext(error->{
return Flowable.error(error);
});
}
И в этом коде он работает нормально, за исключением того, что теперь я не получаю сообщение об ошибке (и это правильно, так как я заменил его новым потокомиз базы данных)
public Flowable<Movie> getMovie(final int id) {
return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
mLocal.save(data);
})).onErrorResumeNext(error->{
return mLocal.getMovie(id).toFlowable();
});
}
Теперь, как я могу сначала получить данные базы данных, а затем запустить сетевой вызов рядом, чтобы обновить данные и получить ошибки из базы данных или сетевого вызова?
ОБНОВЛЕНИЕ
Последний код метода
// calling getMovie on mLocal or mRemote returns Single
public Flowable<Movie> getMovie(final int id) {
return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
mLocal.insertMovie(data);
})).onErrorResumeNext(error -> {
return Flowable.error(error);
});
}
Вот как я их называю
public void loadMovie(int id)
{
Disposable d = mRepo.getMovie(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread(), true)
.doOnSubscribe(subscription -> {
subscription.request(Long.MAX_VALUE);
//post progress here
})
.subscribe(data -> {
//onNext
},
error -> {
//onError
},
() -> {
//onComplete
}
);
mDisposables.add(d);
}