Android函数响应式编程——必学的RxJava错误处理操作符catch、retry

来源:互联网 发布:淘宝网跑步机 编辑:程序博客网 时间:2024/05/21 09:59

为什么要拦截异常?

因为错误出现的时候会调用Subscriber的onError方法把错误分发出去,由SubsCriber自己来处理错误。但是如果每个Subscriber都处理一遍的话,工作量就太大了,这时候可以使用错误处理操作符,这时候可以使用错误处理操作符(?)。

1.catch

onErrorReturn:Observable遇到错误会发射一个特殊的值出去并调用观察者的onCompleted方法。

onErrorReturnNext:Observable遇到错误会发射备用Observable的数据。

onExceptionResumeNext:和上一个类似。区别在于,如果onError收到的Throwable不是一个Exception,它会把错误传递给观察者的onError,不会使用备用的Observable。


这里以第一个举例。

大于2的时候会抛出异常,这个时候就输出了onErrorReturn里的值并且调用了onCompleted方法。(原来的Observable就不管了)

rx.Observable.create(new rx.Observable.OnSubscribe<Integer>() {    @Override    public void call(Subscriber<? super Integer> subscriber) {        for (int i = 0; i < 5; i ++) {            if (i > 2) {                subscriber.onError(new Throwable("Throwable"));            }            subscriber.onNext(i);        }        subscriber.onCompleted();    }}).onErrorReturn(new Func1<Throwable, Integer>() {    @Override    public Integer call(Throwable throwable) {        return 6;    }}).subscribe(new rx.Observer<Integer>() {    @Override    public void onCompleted() {        Log.i("xbh", "onCompleted: ");    }    @Override    public void onError(Throwable e) {        Log.i("xbh", "onError: " + e.getMessage());    }    @Override    public void onNext(Integer integer) {        Log.i("xbh", "onNext: " + integer);    }});

输出

12-09 13:51:19.340 27536-27536/? I/xbh: onNext: 0
12-09 13:51:19.340 27536-27536/? I/xbh: onNext: 1
12-09 13:51:19.340 27536-27536/? I/xbh: onNext: 2
12-09 13:51:19.340 27536-27536/? I/xbh: onNext: 6
12-09 13:51:19.340 27536-27536/? I/xbh: onCompleted: 


2.retry就是重新执行,这里retry(2)就是重复从开头再执行两遍

rx.Observable.create(new rx.Observable.OnSubscribe<Integer>() {    @Override    public void call(Subscriber<? super Integer> subscriber) {        for (int i = 0; i < 5; i ++) {            if (i == 1) {                subscriber.onError(new Throwable("Throwable"));            } else {                subscriber.onNext(i);            }        }        subscriber.onCompleted();    }}).retry(2).subscribe(new rx.Observer<Integer>() {    @Override    public void onCompleted() {        Log.i("xbh", "onCompleted: ");    }    @Override    public void onError(Throwable e) {        Log.i("xbh", "onError: " + e.getMessage());    }    @Override    public void onNext(Integer integer) {        Log.i("xbh", "onNext: " + integer);    }});

输出

12-09 13:53:14.639 29294-29294/com.hdu.a15058124.homework3 I/xbh: onNext: 0
12-09 13:53:14.640 29294-29294/com.hdu.a15058124.homework3 I/xbh: onNext: 0
12-09 13:53:14.640 29294-29294/com.hdu.a15058124.homework3 I/xbh: onNext: 0
12-09 13:53:14.640 29294-29294/com.hdu.a15058124.homework3 I/xbh: onError: Throwable

阅读全文
0 0
原创粉丝点击