我创造了两个可观察者 其中一个抛出异常。
obs1 = Observable.from(new Integer[]{1, 2, 3, 4, 5, 6});
obs2 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override public void call(Subscriber<? super Integer> subscriber) {
boolean b = getObj().equals(""); // this throws an exception
System.out.println("1");
}
});
现在我使用
调用它们Observable.merge(obs2, obs1)
.subscribe(new Observer<Integer>() {
@Override public void onCompleted() {
System.out.println("onCompleted");
}
@Override public void onError(Throwable throwable) {
System.out.println("onError");
}
@Override public void onNext(Integer integer) {
System.out.println("onNext - " + integer);
}
});
现在,我不希望我的进程在发生异常时完全停止 -
我想处理它,我希望obs1继续它的工作。
我试图使用onErrorResumeNext(),onExceptionResumeNext(),doOnError()来编写它 但没有任何帮助 - obs1没有运行。
如何在不停止处理其他observable的情况下处理异常?
答案 0 :(得分:3)
听起来你需要mergeDelayError
。
答案 1 :(得分:0)
问题在于您的订户已损坏。您应该捕获异常并致电onError
。否则,你违反了rx合同。
示例:
Observable<Integer> obs1 = Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6));
Observable<Integer> obs2 = Observable.create((Subscriber<? super Integer> subscriber) -> {
subscriber.onError(new NullPointerException());
});
Observable.merge(obs2.onErrorResumeNext((e) -> Observable.empty()), obs1)
.subscribe(new Observer<Integer>() {
@Override public void onCompleted() {
System.out.println("onCompleted");
}
@Override public void onError(Throwable throwable) {
System.out.println("onError");
}
@Override public void onNext(Integer integer) {
System.out.println("onNext - " + integer);
}
});
因此,如果您使用此代码替换obs2
代码,它应该像您预期的那样工作:
obs2 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override public void call(Subscriber<? super Integer> subscriber) {
try {
boolean b = getObj().equals(""); // this throws an exception
System.out.println("1");
} catch(Exception ex) {
subscriber.onError(ex);
}
}
});