android - 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()
的用户显示错误屏幕,即调用. 为什么我不能在后台线程上运行,显示我的错误屏幕并在主线程上观察,然后在后台线程上重试,并且能够根据需要多次尝试?Retry
retryWhen
ApiUtils.downloadAppData()
retryWhen
ApiUtils.downloadAppData()
解决方案
推荐阅读
- r - 处理比可用内存更大的 quanteda 对象
- php - 如何添加外部 PHP 文件以在 HTML 登录页面中传播
- string - 找到我们可以交换的子序列数,以便给定的字符串保持良好状态
- r - 使用 psych::ICC 时的错误消息:参数长度为零
- python - Conway 在 Python 中的生命游戏在应该是死区的地方生成随机的长线
- reactjs - 反应滚动链接总是从顶部滚动
- python - 在 Django 中保存 UserCreationForm 的问题
- python - 在 PIL 和 CV2 之间保存图像
- javascript - 为什么当我使用 Leaflet 和 pixi-overlay 时我的动画变慢了?
- python - 从 int 对象继承