Я использую RxJava2 для обработки загрузки некоторых данных с использованием Retrofit2, сохранения их в базе данных и отображения сообщения об ошибке с возможностью повторить попытку в случае сбоя.Если это успешно, мне нужно сделать еще один сетевой запрос, обработать ответ и представить другое сообщение об ошибке, если это не удалось.Как только все закончится, пользователь может перейти к следующему экрану.
Я добился определенного успеха, но, похоже, не смог заставить все работать одновременно.Либо некоторые из моих задач пропускаются, и пользователь переходит к концу цепочки, либо наблюдаемые не запускаются последовательно.
Вот моя последняя попытка.
Disposable disposable = initializeMySdk()
.subscribeOn(Schedulers.computation())
.andThen(checkStatus())
.observeOn(AndroidSchedulers.mainThread())
.map(userStatus -> downloadAppData())
.flatMapCompletable((observable) ->
observable.flatMapCompletable((b) -> downloadUserData(getUserId())))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> {
startNextActivity();
}, throwable -> Log.e(TAG, throwable.getMessage()));
initializeMySdk()
возвращает Completable.
checkStatus()
возвращает Single.
downloadAppData()
выглядит следующим образом:
private Observable<Object> downloadAppData() {
return ApiUtils.downloadAppData()
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> {
mNoConnectionLayout.setVisibility(View.VISIBLE);
})
.retryWhen(throwableObservable -> RxView.clicks(mRetryBtn))
.flatMap(stringResponse -> handleNetworkResponse(stringResponse))
.observeOn(AndroidSchedulers.mainThread());
}
downloadUserData
аналогично downloadAppData
, но вместо этогоналичие диалога с кнопкой «Повторить», это просто диалог, который позволит вам продолжить.Вот как это работает сейчас, downloadUserData
не вызывается.Что-то кажется смешным с моими flatMapCompletable
с.
Любая помощь будет принята с благодарностью!
ОБНОВЛЕНИЕ
Вот как выглядит мой блок кодакак сейчас:
Disposable disposable = initializeMySdk()
.subscribeOn(Schedulers.computation())
.andThen(checkStatus())
.flatMapCompletable(userStatus -> downloadAppData())
.andThen(downloadUserData(getUserId()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> {
startNextActivity();
}, throwable -> Log.e(TAG, throwable.getMessage()));
Теперь проблема, кажется, в моей retryWhen
строке:
.retryWhen(throwableObservable -> RxView.clicks(mRetryBtn))
Я получаю это сообщение об ошибке:
Expected to be called on the main thread but was RxComputationThreadPool-1
Я попытался добавить .observeOn(AndroidSchedulers.mainThread())
в нескольких местах по всему коду без какой-либо удачи.Удаление retryWhen
, похоже, решает мои проблемы, но мне нужна возможность повторить попытку.ApiUtils.downloadAppData()
выполняет сетевой запрос с использованием Retrofit2, поэтому он не может работать в главном потоке.
Если ApiUtils.downloadAppData()
выдает ошибку, я показываю экран ошибки пользователю, у которого есть кнопка Retry
,и это кнопка, которая вызывает retryWhen
.Почему я не могу запустить ApiUtils.downloadAppData()
в фоновом потоке, показать экран с ошибками и наблюдать retryWhen
в основном потоке, затем повторить попытку ApiUtils.downloadAppData()
в фоновом потоке и попробовать это столько раз, сколько необходимо