RX操作符之错误处理(catch[onErrorReturn、onErrorResumeNext、onExceptionResumeNext]、retry、retryWhen)
来源:互联网 发布:陈涌海 知乎 编辑:程序博客网 时间:2024/05/15 23:45
一、catch
从onError通知中恢复发射数据。Catch
操作符拦截原始Observable的onError
通知,将它替换为其它的数据项或数据序列,让产生的Observable能够正常终止或者根本不终止。
1.onErrorReturn
让Observable遇到错误时发射一个特殊的项并且正常终止。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { for (int i = 0; i < 5; i++) { if(i == 3) { subscriber.onError(new Throwable("ERROR")); }else{ subscriber.onNext(i + ""); } try { Thread.sleep(1000); } catch (Exception e) { } } subscriber.onCompleted(); } }); Subscriber<String> mySubscriber =new Subscriber<String>() { @Override public void onNext(String s) { Log.e(TAG,"onNext................."+s); } @Override public void onCompleted() { Log.e(TAG, "onCompleted................."); } @Override public void onError(Throwable e) { Log.e(TAG, "onError....................."); } }; observable .onErrorReturn(new Func1<Throwable, String>() { @Override public String call(Throwable throwable) { return "this is an error observable"; } }) .subscribe(mySubscriber);运行结果:
让Observable在遇到错误时开始发射第二个Observable的数据序列。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { for (int i = 0; i < 5; i++) { if(i == 3) { subscriber.onError(new Throwable("ERROR")); }else{ subscriber.onNext(i + ""); } try { Thread.sleep(1000); } catch (Exception e) { } } subscriber.onCompleted(); } }); Subscriber<String> mySubscriber =new Subscriber<String>() { @Override public void onNext(String s) { Log.e(TAG,"onNext................."+s); } @Override public void onCompleted() { Log.e(TAG, "onCompleted................."); } @Override public void onError(Throwable e) { Log.e(TAG, "onError....................."); } }; observable .onErrorResumeNext(Observable.just("this is an error observable","error2")) .subscribe(mySubscriber);
运行结果:
3.onExceptionResumeNext
和onErrorResumeNext
类似,onExceptionResumeNext
方法返回一个镜像原有Observable行为的新Observable,也使用一个备用的Observable,不同的是,如果onError
收到的Throwable
不是一个Exception
,它会将错误传递给观察者的onError
方法,不会使用备用的Observable。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { for (int i = 0; i < 5; i++) { if(i == 3) { subscriber.onError(new Throwable("ERROR")); }else{ subscriber.onNext(i + ""); } try { Thread.sleep(1000); } catch (Exception e) { } } subscriber.onCompleted(); } }); Subscriber<String> mySubscriber =new Subscriber<String>() { @Override public void onNext(String s) { Log.e(TAG,"onNext................."+s); } @Override public void onCompleted() { Log.e(TAG, "onCompleted................."); } @Override public void onError(Throwable e) { Log.e(TAG, "onError....................."); } }; observable .onExceptionResumeNext(Observable.just("occur an error1","occur an error2")) .subscribe(mySubscriber);
运行结果:
二、retry
如果原始Observable遇到错误,重新订阅它期望它能正常终止。Retry
操作符不会将原始Observable的onError
通知传递给观察者,它会订阅这个Observable,再给它一次机会无错误地完成它的数据序列。Retry
总是传递onNext
通知给观察者,由于重新订阅,可能会造成数据项重复。无论收到多少次onError
通知,无参数版本的retry
都会继续订阅并发射原始Observable。
接受单个count
参数的retry
会最多重新订阅指定的次数,如果次数超了,它不会尝试再次订阅,它会把最新的一个onError
通知传递给它的观察者。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { for (int i = 0; i < 5; i++) { if(i == 3) { subscriber.onError(new Throwable("ERROR")); }else{ subscriber.onNext(i + ""); } try { Thread.sleep(1000); } catch (Exception e) { } } subscriber.onCompleted(); } }); Subscriber<String> mySubscriber =new Subscriber<String>() { @Override public void onNext(String s) { Log.e(TAG,"onNext................."+s); } @Override public void onCompleted() { Log.e(TAG, "onCompleted................."); } @Override public void onError(Throwable e) { Log.e(TAG, "onError....................."); } }; observable .retry(2) .subscribe(mySubscriber);
运行结果:
三、retryWhen
retryWhen
和retry
类似,区别是,retryWhen
将onError
中的Throwable
传递给一个函数,这个函数产生另一个Observable,retryWhen
观察它的结果再决定是不是要重新订阅原始的Observable。如果这个Observable发射了一项数据,它就重新订阅,如果这个Observable发射的是onError
通知,它就将这个通知传递给观察者然后终止。retryWhen
默认在trampoline
调度器上执行,你可以通过参数指定其它的调度器。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { for (int i = 0; i < 5; i++) { if(i == 3) { subscriber.onError(new Throwable("ERROR")); }else{ subscriber.onNext(i + ""); } try { Thread.sleep(1000); } catch (Exception e) { } } subscriber.onCompleted(); } }); Subscriber<String> mySubscriber =new Subscriber<String>() { @Override public void onNext(String s) { Log.e(TAG,"onNext................."+s); } @Override public void onCompleted() { Log.e(TAG, "onCompleted................."); } @Override public void onError(Throwable e) { Log.e(TAG, "onError....................."); } }; observable .retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() { @Override public Observable<?> call(Observable<? extends Throwable> errors) { return errors.flatMap(new Func1<Throwable, Observable<?>>() { @Override public Observable<?> call(Throwable error) { // For IOExceptions, we retry if (error instanceof IOException) { return Observable.just(null); } // For anything else, don't retry return Observable.error(error); } }); } }) .subscribe(mySubscriber);
运行结果:
- RX操作符之错误处理(catch[onErrorReturn、onErrorResumeNext、onExceptionResumeNext]、retry、retryWhen)
- RxJava(六) retryWhen操作符实现错误重试机制
- 7.5 Error Handling 错误处理 - Catch/Retry
- Android函数响应式编程——必学的RxJava错误处理操作符catch、retry
- Rxjava操作符(defer,compose,retryWhen)
- RxJava retryWhen操作符实现错误重试机制
- RxJava retryWhen操作符实现错误重试机制
- RxJava(五) onErrorResumeNext操作符实现app与服务器间token机制
- RxJava操作符repeatWhen()和retryWhen()
- RxJava操作符repeatWhen()和retryWhen()
- Rx 入门(五)-- 转换操作符
- Rx操作符 参考
- Rx常用操作符
- RX操作符之辅助操作符三(using、getIterator、toFuture、toIterator、toMap、toMultiMap、nest)
- RX操作符之结合操作(startWith、merge、mergeDelayError、zip、join、groupjoin、switchOnNext)
- RX操作符之辅助操作一(materialize、dematerialize、timestamp、serialize、replay、observeOn、subscribeon、dooneach)
- RX操作之辅助操作符二(doonunsubscribe、doOnCompleted、doOnError、doOnTerminate、finallyDo、delay、delaySubscription)
- RX操作符之对Observable发射的数据执行变换操作一(map、flatmap)
- EBImage中文文档
- 如何编写高质量的测试用例
- 第一个轮子wlazyload插件。为了解决自己系统里面图片懒加载的简单插件
- 课堂笔记2016.8.2
- 【记录】u-boot中添加命令
- RX操作符之错误处理(catch[onErrorReturn、onErrorResumeNext、onExceptionResumeNext]、retry、retryWhen)
- Spring事务传播性与隔离级别
- 关于android开发时,发生Error infalting classa com.baidu.mapapi.map.MapView的解决办法
- 九度OJ 1111 单词替换
- Opencv中对查找表LUT的使用与理解
- laravel 一 搭建环境(mac)Composer下载安装laravel
- OpenWrt in VirtualBox
- alsa 音频路径的问题:
- ※ Leetcode - Dynamic Programming - 53.Maximum Subarray(最大连续和)+152.Maximum Product Subarray(最大连续积)