Rxjava温故知新(七)------RxJava异常型操作符

1.操作符

  • onErrorResumeNext
  • onErrorReturn
  • onExceptionResumeNext

2.操作符案例

2.1 onErrorResumeNext

说明

拦截发射的异常  ,能够处理 throw Exception级别的异常,能够接收异常消息,需要返回一个新的Observable,执行发送 ,不能处理 throw Error级别异常

例子

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
            throw new RuntimeException("hahahhaa"); // 下游onErrorResumeNext 能够处理
	//                throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理

        }
    })
            .onErrorResumeNext(new Function<Throwable, ObservableSource<? extends String>>() {
                @Override
                public ObservableSource<? extends String> apply(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    return Observable.create(new ObservableOnSubscribe<String>() {
                        @Override
                        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                            emitter.onNext("4");
                            emitter.onNext("5");
                            emitter.onNext("6");
                        }
                    });
                }
            })
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(String s) {
                    Log.i(TAG, "onNext: " + s);
                }

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

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

输出信息 (发送完成以后 手动抛出异常,能够被onErrorResumeNext 捕获,并且在里面创建了一个新的Observable,继续发送)

10-25 05:50:17.772 I/MainActivity: onNext: 1
10-25 05:50:17.772 I/MainActivity: onNext: 2
10-25 05:50:17.772 I/MainActivity: onNext: 3
10-25 05:50:17.772 W/System.err: java.lang.RuntimeException: hahahhaa
10-25 05:50:17.772 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity$36.subscribe(MainActivity.java:719)
10-25 05:50:17.772 W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
10-25 05:50:17.772 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:50:17.772 W/System.err:     at io.reactivex.internal.operators.observable.ObservableOnErrorNext.subscribeActual(ObservableOnErrorNext.java:38)
10-25 05:50:17.772 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:50:17.772 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity.aa24(MainActivity.java:738)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:50:17.772 W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
10-25 05:50:17.772 W/System.err:     at android.view.View.performClick(View.java:4204)
10-25 05:50:17.772 W/System.err:     at android.view.View$PerformClick.run(View.java:17355)
10-25 05:50:17.772 W/System.err:     at android.os.Handler.handleCallback(Handler.java:725)
10-25 05:50:17.772 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:50:17.772 W/System.err:     at android.os.Looper.loop(Looper.java:137)
10-25 05:50:17.772 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:50:17.772 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 05:50:17.772 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 05:50:17.772 W/System.err:     at dalvik.system.NativeStart.main(Native Method)
10-25 05:50:17.772 I/MainActivonErrorResumeNextity: onNext: 4
10-25 05:50:17.772 I/MainActivity: onNext: 5
10-25 05:50:17.772 I/MainActivity: onNext: 6

2.2 onErrorReturn

说明

拦截发射的异常,能够处理 throw Execption级别异常 ,能够接收异常消息,可以提供返回一个默认值,但是不能处理 throw Error级别异常

例子

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
            throw new RuntimeException("hahahhaa"); //  下游onErrorReturn 能够处理
//                throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
        }
    })
            .onErrorReturn(new Function<Throwable, String>() {
                @Override
                public String apply(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    return "default";
                }
            })
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(String s) {
                    Log.i(TAG, "onNext: " + s);
                }

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

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

输出结果

10-25 05:56:24.220 I/MainActivity: onNext: 1
10-25 05:56:24.220 I/MainActivity: onNext: 2
10-25 05:56:24.220 I/MainActivity: onNext: 3
10-25 05:56:24.220 W/System.err: java.lang.RuntimeException: hahahhaa
10-25 05:56:24.224 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity$39.subscribe(MainActivity.java:769)
10-25 05:56:24.224 W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
10-25 05:56:24.224 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:56:24.224 W/System.err:     at io.reactivex.internal.operators.observable.ObservableOnErrorReturn.subscribeActual(ObservableOnErrorReturn.java:31)
10-25 05:56:24.224 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:56:24.224 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity.aa25(MainActivity.java:780)
10-25 05:56:24.224 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:56:24.224 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:56:24.224 W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
10-25 05:56:24.224 W/System.err:     at android.view.View.performClick(View.java:4204)
10-25 05:56:24.224 W/System.err:     at android.view.View$PerformClick.run(View.java:17355)
10-25 05:56:24.228 W/System.err:     at android.os.Handler.handleCallback(Handler.java:725)
10-25 05:56:24.228 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:56:24.228 W/System.err:     at android.os.Looper.loop(Looper.java:137)
10-25 05:56:24.228 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 05:56:24.228 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:56:24.228 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:56:24.228 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 05:56:24.228 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 05:56:24.228 W/System.err:     at dalvik.system.NativeStart.main(Native Method)
10-25 05:56:24.228 I/MainActivity: onNext: default
10-25 05:56:24.228 I/MainActivity: onComplete: 

2.3 onExceptionResumeNext

说明

拦截发射的异常,能够处理 throw Execption级别异常 不接受异常信息,获得Observer继续发送,同样不能处理 Error级别的异常

例子

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
                throw new RuntimeException("hahahhaa"); //  下游onErrorReturn 能够处理
//            throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
        }
    })
            .onExceptionResumeNext(new ObservableSource<String>() {
                @Override
                public void subscribe(Observer<? super String> observer) {
                    observer.onNext("4");
                    observer.onNext("5");
                    observer.onNext("6");
                }
            })
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(String s) {
                    Log.i(TAG, "onNext: " + s);
                }

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

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

输出结果 这里抛出了异常,但是接收的地方并没有告知是什么异常,我们可以不用处理。正常执行我们的操作即可

10-25 05:54:48.004 I/MainActivity: onNext: 1
10-25 05:54:48.004 I/MainActivity: onNext: 2
10-25 05:54:48.004 I/MainActivity: onNext: 3
10-25 05:54:48.004 I/MainActivity: onNext: 4
10-25 05:54:48.004 I/MainActivity: onNext: 5
10-25 05:54:48.004 I/MainActivity: onNext: 6

3.总结对比

1. 都不能处理Error级别的错误,
2. 都能拦截到上游的异常
onErrorResumeNext 拦截发射的异常  ,能够处理 throw Exception级别的异常,能够接收异常消息,需要返回一个新的Observable,执行发送 ,不能处理 throw Error级别异常
onErrorReturn     拦截发射的异常,能够处理 throw Execption级别异常 ,能够接收异常消息,可以提供返回一个默认值,但是不能处理 throw Error级别异常
onExceptionResumeNext     拦截发射的异常,能够处理 throw Execption级别异常 不接受异常信息,获得Observer继续发送,同样不能处理 Error级别的异常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章