Catch —拦截原始Observable的onError通知,将它替换为其它的数据项或数据序列,让产生的Observable能够正常终止或者根本不终止。
Rxjava2 实现:
onErrorResumeNext 在错误或异常发生时返回一个Observable,也就是说可以返回多个和源Observable相同类型的结果
onErrorReturn 在Observable发生错误的时候(即将回调oError方法时),拦截错误并执行指定的逻辑,返回一个跟源Observable相同类型的结果,最后回调订阅者的onComplete方法
onErrorReturnItem 在错误或异常发生时返回一个跟源Observable相同类型的项目
onExceptionResumeNext 与onErrorResumeNext操作符类似,不同的地方在于onErrorResumeNext操作符是当Observable发生错误或异常时触发,而onExceptionResumeNext是当Observable发生异常时才触发。
private static void rxCatch() {
Observable
.interval(500, TimeUnit.MILLISECONDS)
.map(new Function<Long, Long>() {
@Override
public Long apply(@NonNull Long aLong) throws Exception {
if (aLong == 3) return null;
return (aLong + 1) * 100;
}
})
.onErrorReturnItem(1000L)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println("onNext: " + aLong);
}
});
while (true);
}
输出结果:
onNext: 100
onNext: 200
onNext: 300
onNext: 1000
Retry —如果Observable发生错误,重新订阅它,如果经过n次重新尝试执行后仍然出现错误或者异常,则最后回调执行onError方法。
private static void rxRetry() {
Observable.interval(500, TimeUnit.MILLISECONDS)
.map(new Function<Long, Long>() {
@Override
public Long apply(@NonNull Long aLong) throws Exception {
if (aLong == 3) return null;
return (aLong + 1) * 100;
}
})
.retry(3)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println("onNext: " + aLong);
}
});
while (true);
}
输出结果:
onNext: 100
onNext: 200
onNext: 300onNext: 100
onNext: 200
onNext: 300onNext: 100
onNext: 200
onNext: 300onNext: 100
onNext: 200
onNext: 300