Rxjava從使用到原碼的解析七: Rxjava異常型操作符

Rxjava異常型操作符

onErrorReturn

當發射onError事件的時候,就會攔截這個事件

onErrorResumeNext

跟onErrorReturn 差不多,只是onErrorResumeNext 返回的是一個被觀察者,可以自己發射事件

onExceptionResumeNext

可以防止應用異常崩潰

 

retry

重試操作符,就是當上遊發射了onError的時候,就會走到重試操作符裏

onErrorReturn

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                for (int i = 0; i < 100; i++) {
                    if (i == 5) {
                        e.onError(new IllegalArgumentException("異常了..."));
                    } else {
                        e.onNext(i);
                    }
                }
                e.onComplete();
            }
        }).onErrorReturn(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Exception {
                Log.e(TAG, "onErrorReturn" + throwable.getMessage());
                return 404;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG, "onNext: " + integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError");
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete");
            }
        });

就像上面代碼,前面先會輸出

onNext: 1

onNext: 2

onNext: 3

onNext: 4

當i==5的時候發送了一個onError事件,這個時候就會被onErrorReturn異常操作符給攔截輸出

onErrorReturn異常了...

然後在他的apply方法裏就會自動發射出一個onNext事件給下游接收,就會輸出

onNext: 400  最後就是輸出

onComplete

在這過程中不會輸出onError下游事件

如果發射事件的時候直接異常了這個時候 程序會崩潰,

如果沒有異常操作符的話,就會直接走到下游的onError

onExceptionResumeNext

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                for (int i = 0; i < 100; i++) {
                    if (i == 5) {
                        throw new Exception("解析數據出錯");
                    } else {
                        e.onNext(i);
                    }
                }
                e.onComplete();
            }
        })
                .onExceptionResumeNext(new ObservableSource<Integer>() {
                    @Override
                    public void subscribe(Observer<? super Integer> observer) {
                        Log.e(TAG, "onExceptionResumeNext");
                        observer.onNext(400);
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }
                    @Override
                    public void onNext(Integer integer) {
                        Log.e(TAG, "onNext" + integer);
                    }
                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError" );
                    }
                    @Override
                    public void onComplete() {
                        Log.e(TAG, "onComplete" );
                    }
                });

當在上游直接throw new Exception("解析數據出錯");的時候,應用不會直接閃退,會直接到到異常操作符事件那.

 

retry

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                for (int i = 0; i < 100; i++) {
                    if (i == 5) {
                        throw new Exception("解析數據出錯");
                    } else {
                        e.onNext(i);
                    }
                }
                e.onComplete();
            }
        })
                .retry(new Predicate<Throwable>() {
                    @Override
                    public boolean test(Throwable throwable) throws Exception {
                        Log.e(TAG, "retry: "+ throwable.getMessage());
                        return false;//如果返回false則不重試
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e(TAG, "onNext" + integer);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.e(TAG, "onComplete");
                    }
                });

他還有幾個API

                .retry(4, new Predicate<Throwable>() {//代表會 重試4次
                    @Override
                    public boolean test(Throwable throwable) throws Exception {
                        return true;
                    }
                })
                .retry(new BiPredicate<Integer, Throwable>() {
                    @Override
                    public boolean test(Integer integer, Throwable throwable) throws Exception {
                        return true;//integer現在重試的是多少次                    }
                })

 

Rxjava理解一

Rxjava理解二

Rxjava理解三

Rxjava理解四

Rxjava理解五

Rxjava理解六

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章