RxJava的do操作符

1,256 阅读2分钟

do操作符可以给Observable的生命周期的各个阶段加上一系列的回调监听,当Observable执行到这个阶段时,这些回调就会被触发。

操作符 用途
doOnSubscribe 一旦观察者订阅了Observable,它就会被调用
doOnLifecycle 可以在观察者订阅后,设置是否取消订阅
doOnNext 它产生的Observable每发射一型数据就回调它一次,它的Consumer接受发射的数据项。一般用于在subscribe之前对数据进行处理
doOnEach 它产生Observable每发射一项数据就会调用它一次,不仅包括onNext,还包括onErroronCompleted
doAfterNext onNext之后执行,而doOnNext()``在onNext之前执行
doOnComplete 当它产生Observable在正常终止调用onComplete时会被调用
doFinally 在它产生的Observable终止之后会被调用,无论是正常终止还是异常终止doFinally优先于doAfterTerminate的调用
doAfterTerminate 注册一个Action,当Observable调用onCompleteonError时触发

具体的例子:

        Observable.just("Hello World")
                .doOnNext(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        System.out.println("doOnNext: " + s);
                    }
                })
                .doAfterNext(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        System.out.println("doAfterNext: " + s);
                    }
                })
                .doOnComplete(new Action() {
                    @Override
                    public void run() throws Exception {
                        System.out.println("doOnComplete: ");
                    }
                })
                //订阅之后回调的方法
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        System.out.println("doOnSubscribe: ");
                    }
                })
                .doAfterTerminate(new Action() {
                    @Override
                    public void run() throws Exception {
                        System.out.println("doAfterTerminate: ");
                    }
                })
                .doFinally(new Action() {
                    @Override
                    public void run() throws Exception {
                        System.out.println("doFinally: ");
                    }
                })
                //Observable 每发射一个数据就会触发这个回调,不仅包括onNext,还包括onError和onCompleted
                .doOnEach(new Consumer<Notification<String>>() {
                    @Override
                    public void accept(Notification<String> stringNotification) throws Exception {
                        System.out.println("doOnEach: " + (stringNotification.isOnNext() ?
                                "OnNext" : stringNotification.isOnComplete() ? "onComplete:" : "onError"));
                    }
                })
                //订阅后可以取消订阅
                .doOnLifecycle(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        System.out.println("doOnLifecycle: " + disposable.isDisposed());
                    }
                }, new Action() {
                    @Override
                    public void run() throws Exception {
                        System.out.println("doOnLifecycle run: ");
                    }
                })
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        System.out.println("收到消息: " + s);
                    }
                });

内容来源于:RxJava 2.x实战(沈哲著)