我有一个可能会出现特殊异常的可观察对象,在这种情况下,我想显示一个带有重试按钮的对话框。我看到了这个答案,但它并不能完全满足我的需求。我无法使用
目前,我有以下代码:
问题在于
我已经使用不在单独线程上运行的简单可观察对象测试了我的代码,并且它可以正常工作。
retryWhen
来解决我的问题,因此我改用了onErrorResumeNext
。如果您能想出一种使用retryWhen
实现相同功能的方法,请告诉我。目前,我有以下代码:
public Observable<Order> proceedWithOrdering(Activity activity) {
return apiService.createOrder()
.subscribeOn(Schedulers.io())
.compose(applyRetryLogic(activity))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread());
}
public <T extends ApiResponse> Observable.Transformer<T, T> applyRetryLogic(Activity activity) {
return observable -> observable
.onErrorResumeNext(retry(observable, activity))
.subscribeOn(AndroidSchedulers.mainThread());
}
public <T> Func1<Throwable, ? extends Observable<? extends T>> retry(Observable toRetry, Activity activity) {
return throwable -> {
if (throwable instanceof NetworkException) {
MaterialDialog dialog = retryDialog(activity);
View retry = dialog.getActionButton(DialogAction.POSITIVE);
View cancel = dialog.getActionButton(DialogAction.NEGATIVE);
Observable<Object> retryClick = RxView.clicks(retry).map(o -> {
dialog.dismiss();
return o;
});
Observable<Object> cancelClick = RxView.clicks(cancel).flatMap(o -> {
dialog.dismiss();
return Observable.error(throwable);
});
dialog.show();
return Observable.amb(retryClick, cancelClick)
.flatMap(o -> toRetry.compose(applyRetryLogic(activity)));
} else {
return Observable.error(throwable);
}
};
}
问题在于
retry
内部的call
不是在主线程上执行,因此会引发Can't create handler inside thread that has not called Looper.prepare()
异常。
问题是 - 如何强制它在主线程上执行?如您所见,我已经尝试在compose
和onErrorResumeNext
之后立即使用subscribeOn(AndroidSchedulers.mainThread())
,但没有成功。我已经使用不在单独线程上运行的简单可观察对象测试了我的代码,并且它可以正常工作。
retryWhen
的解决方案,谢谢。我已经将您的第一个解决方案适配到了 Android 上,并将其发布为单独的答案供其他用户查看。 - Egor NeliubaretryWhen(o -> o.observeOn(AndroidSchedulers.mainThread())...)
对我很有帮助。点赞。 - ror