Rxjava异常操作符

Rxjava操作符索引

这篇章主要介绍Rxjava的异常操作符

目录

Catch

onErrorReturnItem

onErrorReturn

onErrorResumeWith

onErrorResumeNext

Retry

retry

retryUntil


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

发布了21 篇原创文章 · 获赞 14 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章