- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 observable,它可能会因特殊异常而失败,在这种情况下,我想显示一个带有重试按钮的对话框。我看过this回答,但它并不能完全满足我的要求。我无法使用 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称为 Looper.prepare()
异常。
问题是——我如何强制它在主线程上执行?如您所见,我已经尝试在 compose
和 onErrorResumeNext
之后立即执行 subscribeOn(AndroidSchedulers.mainThread())
但没有成功。
我已经使用不在单独线程上运行的简单可观察对象测试了我的代码,并且运行良好。
最佳答案
您可以通过 flatMap
ping 一个 PublishSubject
来完成此操作,然后在按下相关按钮后更新该主题。这是一个经典的 Java Swing 示例。
public class RetryWhenEnter {
public static void main(String[] args) {
AtomicInteger d = new AtomicInteger();
Observable<Integer> source = Observable.just(1);
source.flatMap(v -> {
if (d.incrementAndGet() < 3) {
return Observable.error(new RuntimeException());
}
return Observable.just(v);
})
.retryWhen(err -> {
return err.flatMap(e -> {
System.out.println(Thread.currentThread() + " Error!");
PublishSubject<Integer> choice = PublishSubject.create();
SwingUtilities.invokeLater(() -> {
int c = JOptionPane.showConfirmDialog(null,
e.toString() + "\r\nRetry?", "Error",
JOptionPane.YES_NO_OPTION);
if (c == JOptionPane.YES_OPTION) {
choice.onNext(1);
} else {
choice.onCompleted();
}
});
return choice;
});
}).subscribe(System.out::println,
Throwable::printStackTrace);
}
}
编辑:
或者在 onErrorResumeNext
之前或使用 retryWhen
时使用 observeOn(AndroidSchedulers.mainThread())
: retryWhen(o -> o.observeOn(AndroidSchedulers.mainThread())...)
.
编辑 2我回滚了更改,因此答案再次有意义。
关于java - RxJava onErrorResumeNext 调度器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30889279/
我正在使用 Interval 运算符,即使我的管道发生异常,我也想继续发射项目。 所以我尝试使用 onErrorResumeNext 在出现异常时发出一个项目。但是我看到在发出这个项目之后,间隔停止发
我有两个可观察对象(为简单起见命名为 A 和 B)和一个订阅者。因此,订阅者订阅 A,如果 A 出现错误,则 B(这是后备)启动。现在,每当 A 遇到错误时,B 都会正常调用,但是 A 会调用订阅者的
我有一个 observable,它可能会因特殊异常而失败,在这种情况下,我想显示一个带有重试按钮的对话框。我看过this回答,但它并不能完全满足我的要求。我无法使用 retryWhen 来解决我的问题
在 RxJS 中,Observable 实例的 catch 方法和 onErrorResumeNext 方法之间似乎没有什么区别,除了 onErrorResumeNext 连接原始 Observabl
我有以下 rxJava 链: override fun combineLocationToPlace(req: Flowable): Flowable { var combinedF
如果在 RxSwift 中遇到错误,我需要发出一系列项目。在 JAVA 中,可以使用“onErrorResumeNext”运算符来完成。但是我在 Swift 中找不到相同的运算符或其替代品。 最佳答案
我对 RxJava onErrorResumeNext 运算符有疑问。我想获取位置,然后根据位置从服务器获取数据(使用 Retrofit),但是如果没有位置(错误:序列不包含元素),我想使用另一个 O
我是一名优秀的程序员,十分优秀!