考虑这个例子:
@Test
public void testOnErrorReturn() {
final Observable<String> stringObservable = Observable.defer(new Callable<ObservableSource<String>>() {
@Override
public ObservableSource<String> call() throws Exception {
throw new RuntimeException("Too Bad");
}
});
Observable<String> observable = Observable.intervalRange(0, 5, 0, 500, TimeUnit.MILLISECONDS)
.flatMap(new Function<Long, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(@NonNull Long aLong) throws Exception {
return stringObservable;
}
})
.onErrorReturn(new Function<Throwable, String>() {
@Override
public String apply(@NonNull Throwable throwable) throws Exception {
return "That Passed";
}
})
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
System.out.println("OnComplete first stream.");
}
});
observable.mergeWith(Observable.<String>never())
.doOnNext(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
System.out.println("accept() called with: s = [" + s + "]");
}
})
.test().awaitDone(5, TimeUnit.SECONDS);
}
输出:
accept() called with: s = [That Passed]
OnComplete first stream.
只有在onErrorReturn
内设置flatMap
时才有效:
return stringObservable.onErrorReturn(new Function<Throwable, String>() {
@Override
public String apply(@NonNull Throwable throwable) throws Exception {
return "That Passed early";
}
});
但是我在链中丢失了错误信息。如何保持流存活并优雅地抑制终止?
答案 0 :(得分:0)
这取决于你想要做什么。一种选择是将flatMap
内的错误和成功值映射到Try
类型,然后在外Observable
处理。
另一种选择是使用.flatMap(function, true)
延迟错误,然后流将处于活动状态直到完成,您将能够处理成功的值,并最终会收到复合错误通知。