首页 > 解决方案 > RxJava2 - 使用错误消息链接多个可观察对象

问题描述

我正在使用 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()返回一个可完成的。

checkStatus()返回单人。

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方式,没有被调用。我的 s 似乎有些有趣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()的用户显示错误屏幕,即调用. 为什么我不能在后台线程上运行,显示我的错误屏幕并在主线程上观察,然后在后台线程上重试,并且能够根据需要多次尝试?RetryretryWhenApiUtils.downloadAppData()retryWhenApiUtils.downloadAppData()

标签: androidrx-java2

解决方案


推荐阅读