RxJava操作符(5)-错误
2016-08-13 13:45
246 查看
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) { 4000 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); } } } }); }
运行代码,结果如下:
接下来就是鸣谢了,非常感谢以下两位博主,相关链接如下:
https://mcxiaoke.gitbooks.io/rxdocs/content/operators/Error-Handling-Operators.html
http://mushuichuan.com/2015/12/11/rxjava-operator-5/
github地址
相关文章推荐
- RxJava 错误处理操作符(Error Handling Operators)
- RxJava----操作符:错误处理
- RxJava 错误处理操作符(Error Handling Operators)
- Android函数响应式编程——必学的RxJava错误处理操作符catch、retry
- RxJava操作符(06-错误处理)
- RxJava操作符(06-错误处理)
- RxJava中的创建操作符
- 你一定会用到的RxJava常用操作符
- RxJava之转换操作符
- RxJava 1.x 笔记:变换型操作符
- Android RxJava:这是一份全面 & 详细 的RxJava操作符 使用攻略
- 记录一下RxJava和Retrofit2之间导包的错误
- RxJava--操作符学习笔记
- RxJava 1.x 笔记:组合型操作符
- RxJava的map操作符
- RxJava(九)zip操作符在Android中的实际使用场景
- RxJava操作符 -创建型
- 从零开始的RxJava2.0教程(二)操作符
- RxJava2与Retrofit使用错误记录
- RxJava操作符(09-算术/聚合操作&连接操作)