RxJava操作符(5)-错误

OnErrorReturn

OnErrorReturn操作符是当遇到异常发生时,让Observable发射一个事先预定好的数据出去。

原理图如下:


OnErrorReturn操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = createErrorObservable(false).onErrorReturn(new Func1() {
            @Override
            public Object call(Object o) {
                displayLogcat("onErrorReturn Object = " + o);
                return "onErrorReturn throwable";
            }
        });
    }

    private Observable createErrorObservable(final boolean isException) {
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    if (i == 3) {
                        if (isException) {
                            subscriber.onError(new Exception("exception error return"));
                        } else {
                            subscriber.onError(new Throwable("throwable error return"));
                        }
                    } else {
                        subscriber.onNext(i);
                    }
                }
            }
        });
    }


运行代码,结果如下:

OnErrorResumeNext

OnErrorResumeNext操作符是当遇到异常发生时,发射下一个Observable
里的数据。

原理图如下:


OnErrorResumeNext操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
       mObservable = createErrorObservable(false).onErrorResumeNext(Observable.just(5, 6, 7));
    }

    private Observable createErrorObservable(final boolean isException) {
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    if (i == 3) {
                        if (isException) {
                            subscriber.onError(new Exception("exception error resume next"));
                        } else {
                            subscriber.onError(new Throwable("throwable error resume next"));
                        }
                    } else {
                        subscriber.onNext(i);
                    }
                }
            }
        });
    }


运行代码,结果如下:

OnExceptionResumeNext

OnExceptionResumeNext操作符跟onErrorResumeNext操作符类型,只是OnExceptionResumeNext操作符区分了抛出异常的类型,如果是以exception抛出的,则表现形式跟onErrorResumeNext操作符一致,如果是以throwable抛出的,则会将这个错误发射出去。

原理图如下:


OnExceptionResumeNext操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = createErrorObservable(false).onExceptionResumeNext(Observable.just(5, 6, 7));
    }

    private Observable createErrorObservable(final boolean isException) {
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    if (i == 3) {
                        if (isException) {
                            subscriber.onError(new Exception("exception on exception resume next"));
                        } else {
                            subscriber.onError(new Throwable("throwable on exception resume next"));
                        }
                    } else {
                        subscriber.onNext(i);
                    }
                }
            }
        });
    }


运行代码,结果如下:

Retry

OnExceptionResumeNext操作符跟onErrorResumeNext操作符类型,只是OnExceptionResumeNext操作符区分了抛出异常的类型,如果是以exception抛出的,则表现形式跟onErrorResumeNext操作符一致,如果是以throwable抛出的,则会将这个错误发射出去。

原理图如下:


Retry操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = createErrorObservable(false).retry(1);
    }

    private Observable createErrorObservable(final boolean isException) {
        displayLogcat("subscriber");
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 5; i++) {
                    if (i == 3) {
                        if (isException) {
                            subscriber.onError(new Exception("exception retry"));
                        } else {
                            subscriber.onError(new Throwable("throwable retry"));
                        }
                    } else {
                        subscriber.onNext(i);
                    }
                }
            }
        });
    }


运行代码,结果如下:

RetryWhen

RetryWhen操作符当遇到异常时,retryWhen将onError中的Throwable传递给一个函数,这个函数产生另一个Observable,retryWhen观察它的结果再决定是不是要重新订阅原始的Observable。如果这个Observable发射了一项数据,它就重新订阅,如果这个Observable发射的是onError通知,它就将这个通知传递给观察者然后终止。

原理图如下:


RetryWhen操作符使用如下:

    @Override
    protected void createObservable() {
        super.createObservable();
        mObservable = createErrorObservable(false).retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
            @Override
            public Observable<?> call(Observable<? extends Throwable> observable) {
                displayLogcat("retryWhen call");
                return observable.create(new Observable.OnSubscribe<Integer>() {
                    @Override
                    public void call(Subscriber<? super Integer> subscriber) {
                        subscriber.onNext(1);
//                        subscriber.onError(new Throwable("123"));
                    }
                });
            }
        });
    }

    private Observable createErrorObservable(final boolean isException) {
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                displayLogcat("subscriber");
                for (int i = 0; i < 5; i++) {
                    if (i == 3) {
                        if (isException) {
                            subscriber.onError(new Exception("exception retry when"));
                        } else {
                            subscriber.onError(new Throwable("throwable retry when"));
                        }
                    } else {
                        subscriber.onNext(i);
                    }
                }
            }
        });
    }


运行代码,结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值