RxJava 操作符之事件回调 do 系列操作符

继续之前的RxJava 操作符系列文档,今天来研究一下do 操作符,也可以理解为 rxJava 各种事件的回调,比如当发生了onError ,我想在此做些什么,就可以使用一个回调操作,就可以用doOnError () 来实现。好了,老规矩,先列出参考文章

http://reactivex.io/documentation/operators/do.html

来看看官方解释

register an action to take upon a variety of Observable lifecycle events

意思就是注册一个动作来监听生命周期的各个事件。想想有什么事件呢? 订阅,取消订阅,onNext, onError, onComplete, 终止,结束等等,官方列举有如下事件:

 

代码展示

 Observable<String> mStringObservable;

    Observable<String> mStringErorObservable;

    Observer<String> mStringSubscriber;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_do_operation);

        mStringErorObservable = Observable.create(new ObservableOnSubscribe<String>() {

            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                for (int i = 0; i < 5; i++) {
                    if(i == 3) {
                        emitter.onError(new Throwable("ERROR"));
                    }else{
                        emitter.onNext(i + "");
                    }
                }
                emitter.onComplete();
            }
        });

        mStringObservable = Observable.create(new ObservableOnSubscribe<String>() {

            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                for (int i = 0; i < 5; i++) {
                    emitter.onNext(i + "");
                }
                emitter.onComplete();
            }
        });

        mStringSubscriber = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "onSubscribe: ");
            }

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

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

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

doError 、doOnNext 、 doComplete

public void doOnError(View view){
        mStringErorObservable.doOnError(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                Log.d(TAG, "doOnError accept: " + throwable.getMessage());
            }
        }).subscribe(mStringSubscriber);
    }

日志打印:

 D/DoOperateActivity: onSubscribe: 
 D/DoOperateActivity: onNext: 0
 D/DoOperateActivity: onNext: 1
 D/DoOperateActivity: onNext: 2
 D/DoOperateActivity: doOnError accept: ERROR
 D/DoOperateActivity: onError: ERROR

 结果分析:

由于注册了DoOnError 函数,当遇到错误时,会先触发 doOnError 回调,在执行onError 函数;类似的,onNext , onComplete对应的回调函数都会先于其本身执行。另外的,遇到错误onError后,onComplete 不会被执行,相当于异常终止,如果想要执行onComplete, 可以参考Error Handling 里面的操作符。

public void doOnCompleteOnNextdoOnError(View view){
        mStringObservable.doOnError(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                Log.d(TAG, "accept: " + throwable.getMessage());
            }
        }).doOnNext(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, "accept: " + s);
            }
        }).doOnComplete(new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: doOnComplete");
            }
        }).subscribe(mStringSubscriber);
    }

日志打印:

D/DoOperateActivity: onSubscribe: 
D/DoOperateActivity: accept: 0
D/DoOperateActivity: onNext: 0
D/DoOperateActivity: accept: 1
D/DoOperateActivity: onNext: 1
D/DoOperateActivity: accept: 2
D/DoOperateActivity: onNext: 2
D/DoOperateActivity: accept: 3
D/DoOperateActivity: onNext: 3
D/DoOperateActivity: accept: 4
D/DoOperateActivity: onNext: 4
D/DoOperateActivity: run: doOnComplete
D/DoOperateActivity: onComplete: 

结果分析:

这次用了一个正常的数据源,doOnNext 会在 onNext前调用,同理 doOnComplete 也是的。和第一个分析一致。注意:想要回调执行doOnComplete , 数据源必须调用onComplete , 否则观察者不会执行onComplete, 而doOnComplete 的回调基于onComplete的,所以这样说大家应该明白了。

doOnEach

The doOnEach operator allows you to establish a callback that the resulting Observable will call each time it emits an item. You can pass this callback either in the form of an Action that takes an onNext variety of Notification as its sole parameter, or you can pass in an Observer whose onNext method will be called as if it had subscribed to the Observable.

doOnEach运算符允许您建立一个回调,结果Observable每次发出一个项目时都会调用它。 您可以以Action的形式传递此回调,该Action将onNext各种Notification作为其唯一参数,或者您可以传入一个Observer,其onNext方法将被调用,就好像它已订阅了Observable一样。

就是会对观察者的onNext onError onComplete 三个方法做出回调

我们可以看代码:

 public void doEach(View view){
        mStringObservable.doOnEach(new Consumer<Notification<String>>() {
            @Override
            public void accept(Notification<String> stringNotification) throws Exception {
                Log.d(TAG, "accept: ");
            }
        }).subscribe(mStringSubscriber);

        mStringObservable.doOnEach(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "doOnEach onSubscribe: ");
            }

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

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

            @Override
            public void onComplete() {
                Log.d(TAG, "doOnEach onComplete: ");
            }
        }).subscribe(mStringSubscriber);
    }

日志打印:

D/DoOperateActivity: onSubscribe: 
D/DoOperateActivity: accept: 
D/DoOperateActivity: onNext: 0
D/DoOperateActivity: accept: 
D/DoOperateActivity: onNext: 1
D/DoOperateActivity: accept: 
D/DoOperateActivity: onNext: 2
D/DoOperateActivity: accept: 
D/DoOperateActivity: onNext: 3
D/DoOperateActivity: accept: 
D/DoOperateActivity: onNext: 4
D/DoOperateActivity: accept: 
D/DoOperateActivity: onComplete: 
D/DoOperateActivity: onSubscribe: 
D/DoOperateActivity:  doOnEach onNext: 0
D/DoOperateActivity: onNext: 0
D/DoOperateActivity:  doOnEach onNext: 1
D/DoOperateActivity: onNext: 1
D/DoOperateActivity:  doOnEach onNext: 2
D/DoOperateActivity: onNext: 2
D/DoOperateActivity:  doOnEach onNext: 3
D/DoOperateActivity: onNext: 3
D/DoOperateActivity:  doOnEach onNext: 4
D/DoOperateActivity: onNext: 4
D/DoOperateActivity: doOnEach onComplete:
D/DoOperateActivity: onComplete: 

结果分析:

对onNext ,onComplete 都做出了响应,有点组合doOnNext 和 doOnComplete的意思。

然后我把数据源换成了mStringErrorObservale 后,日志打印变成了

D/DoOperateActivity: onSubscribe: 
D/DoOperateActivity:  doOnEach onNext: 0
D/DoOperateActivity: onNext: 0
D/DoOperateActivity:  doOnEach onNext: 1
D/DoOperateActivity: onNext: 1
D/DoOperateActivity:  doOnEach onNext: 2
D/DoOperateActivity: onNext: 2
D/DoOperateActivity: doOnEach onError: java.lang.Throwable: ERROR
D/DoOperateActivity: onError: ERROR

其他的Do操作符

public void doOther(View view){
        mStringErorObservable.doOnTerminate(new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "doOnTerminate run: ");
            }
        }).doOnSubscribe(new Consumer<Disposable>() {
            @Override
            public void accept(Disposable disposable) throws Exception {
                Log.d(TAG, "doOnSubscribe accept: ");
            }
        }).doOnLifecycle(new Consumer<Disposable>() {
            @Override
            public void accept(Disposable disposable) throws Exception {
                Log.d(TAG, "doOnLifecycle accept: ");
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "doOnLifecycle run: ");
            }
        }).doFinally(new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: doFinally");
            }
        }).doAfterTerminate(new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: doAfterTerminate");
            }
        }).subscribe(mStringSubscriber);
    }

日志打印:

 D/DoOperateActivity: doOnSubscribe accept: 
 D/DoOperateActivity: doOnLifecycle accept: 
 D/DoOperateActivity: onSubscribe: 
 D/DoOperateActivity: onNext: 0
 D/DoOperateActivity: onNext: 1
 D/DoOperateActivity: onNext: 2
 D/DoOperateActivity: doOnTerminate run: 
 D/DoOperateActivity: onError: ERROR
 D/DoOperateActivity: run: doAfterTerminate
 D/DoOperateActivity: run: doFinally

其他的操作符,我们都能见名晓意,不用一一解释了。

好了,do相关的操作符介绍完了,归纳就是一句话:对各种事件监听并做出回应。

register an action to take upon a variety of Observable lifecycle events

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