RxJava2 - связывание нескольких наблюдаемых с сообщениями об ошибках - PullRequest
0 голосов
/ 20 ноября 2018

Я использую 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() в фоновом потоке и попробовать это столько раз, сколько необходимо

...