Я пытаюсь получить элементы из удаленного источника, если это не сработает (без интернета), я бы хотел получить кэшированные элементы из базы данных комнаты.Я создал новый сингл для случая, когда произошла ошибка, и я указал, на какой поток он должен подписаться и наблюдать.Я по-прежнему это исключение, хотя:
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Это метод для извлечения элементов:
public LiveData<List<Article>> getNewsArticles() {
return LiveDataReactiveStreams.fromPublisher(
newsService.getNewsArticles()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorResumeNext(throwable ->
Single.just(newsDao.findAllForNumber(AMOUNT_OF_ARTICLES_PER_PAGE))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(newsArticles -> Completable.fromAction(() ->
newsDao.insertAll(newsArticles))
.subscribeOn(Schedulers.io()))
.toFlowable());
}
LiveDataReactiveStreams преобразует его в объект liveata и обрабатывает подписку, так что мое представление знает толькоо livingata.
Я просто не могу заставить вызов onErrorResumeNext работать в фоновом потоке.
Любая помощь будет принята с благодарностью!
ОТВЕТ
Я решил проблему с помощью следующего кода:
public LiveData<List<Article>> getNewsArticles() {
return LiveDataReactiveStreams.fromPublisher(
newsService.getNewsArticles()
.observeOn(Schedulers.io())
.doOnSuccess(newsArticles -> newsDao.insertAll(newsArticles))
.onErrorResumeNext(throwable -> Single.fromCallable(() -> newsDao.findAllForNumber(AMOUNT_OF_ARTICLES_PER_PAGE)))
.toFlowable());
}