这篇章主要介绍Rxjava的异常操作符
目录
Catch
主要拦截原始Observable的onError通知,替换成为其他数据项或数据列。
onErrorReturnItem
让observable遇到错误时发射一个指定数据项并正常终止
Observable observable = Observable.create(observableEmitter -> {
for (int i = 0; i < 5; i++){
if (i == 2){
observableEmitter.onError(new Exception("异常测试"));
}else{
observableEmitter.onNext(i+"");
}
}
observableEmitter.onComplete();
});
observable.onErrorReturnItem(-1).subscribe(num -> System.out.println(num+"*"));
结果:
0*
1*
-1*
看到代码就明白了,我设置发射数据等于2的时候报异常,然后异常的时候就打印了-1
onErrorReturn
这个跟上面的区别的是,它可以捕捉到异常,那你就可以根据异常来决定返回那个数据源
observable.onErrorReturn(new Function<Throwable, Integer>() {
@Override
public Integer apply(Throwable throwable) throws Throwable {
System.out.println(throwable.getMessage());
return -1;
}
}).subscribe(num -> System.out.println(num+"*"));
结果:
0*
1*
异常测试
-1*
这里的observable跟上面一样,只是换了个catch操作符的操作。
onErrorResumeWith
这个操作符,当异常的时候,切换发射第二个observable的数据列
observable.onErrorResumeWith(Observable.just(-1,-2,-3)).subscribe(num -> System.out.println(num+"*"));
结果:
0*
1*
-1*
-2*
-3*
一样是上面的observable,遇到2的时候异常,然后就发射第二个设置的observable了
onErrorResumeNext
这个就不写代码了,它其实跟上面的onErrorResumeWith一样遇到异常发射第二个observable,不过它跟onErrorReturn一样可以拿到异常,那就可以根据异常决定设置哪个observable
Retry
当observable遇到异常时,就行重新订阅
retry
// 不加参数就是无限地retry
observable.retry(2).subscribe(num -> System.out.println(num+"*")
, throwable -> System.out.println("异常测试"));
结果:
0*
1*
0*
1*
0*
1*
异常测试
observable还是上面catch操作符里面的例子那个。retry里面填了参数2,表明会重新订阅两次,还是异常就输出异常。如果不填参数,就会不断retry,直到不异常为止
retryUntil
简单一句就是有条件的retry
observable.retryUntil(new BooleanSupplier() {
@Override
public boolean getAsBoolean() throws Throwable {
// true就表示不retry了,进入异常
// false就表示继续retry
return true;
}
}).subscribe(num -> System.out.println(num+"*")
, throwable -> System.out.println("异常测试"));
结果:
0*
1*
异常测试
如代码所示,当函数里面返回true就不retry了,false就继续retry