[RxJava学习]操作符Do的使用

本文详细介绍了RxJava中Observable的Do系列函数,包括doOnNext、doOnCompleted、doOnError等,解释了它们如何通过注册回调来监听链式操作的不同阶段,并提供了具体的使用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Observable中Do系列的函数,是通过注册回调的方式,来侦听链式操作过程的各个动作节点。
函数名函数用途函数原型
doOnNext在每次发射元素之前(调用subScriber.onNext())做一些额外的事情,不改变发射元素的值,只是插入了一个侦听Observable<T> doOnNext(final Action1<? super T> onNext)
doOnCompleted在发射完成通知之前做一些额外的事情,不改变原有逻辑流,只是插入了一个侦听Observable<T> doOnCompleted(final Action0 onCompleted)
doOnError在发射错误通知之前做一些额外的事情,不改变原有逻辑流,只是插入了一个侦听Observable<T> doOnError(final Action1<Throwable> onError)
doOnTerminate在发射通知之前做一些额外的事情(即对onError和onCompleted的调用进行了侦听)Observable<T> doOnTerminate(final Action0 onTerminate)
doOnEach对发射元素和发射通知进行了统一的封装,用于在发射元素或者发射通知之前做一些额外的事情Observable<T> doOnEach(final Action1<Notification<? super T>> onNotification)Observable<T> doOnEach(Observer<? super T> observer)
doOnRequest通常用于跟踪调试,当订阅者开始请求数据时,可以通过这个方法进行侦听,一般是每subscribe一个订阅者就会触发一次Observable<T> doOnRequest(final Action1<Long> onRequest)
doOnSubscribe当订阅者订阅时,可以通过这个方法侦听,它会早于doOnRequest被调用Observable<T> doOnSubscribe(final Action0 subscribe)
doOnUnsubscribe当订阅者取消订阅时,可以通过这个方法侦听Observable<T> doOnUnsubscribe(final Action0 unsubscribe)

下面是本次学习的用例:

    private void testOperDo(){
        String SDCARD = Environment.getExternalStorageDirectory().toString();
        ArrayList<File> folders = new ArrayList<>();
        folders.add(new File(SDCARD + File.separator + "BangBang" + File.separator));
        Observable observable12 = Observable.from(folders)
                .flatMap(new Func1<File, Observable<File>>() {
                    @Override
                    public Observable<File> call(File file) {
                        Log.e("chwn", "flatMap>>call:" + file.getName());
                        if(file.isDirectory()) {
                            return Observable.from(file.listFiles());
                        } else{
                            return Observable.just(file);
                        }
                    }
                }).doOnRequest(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.e("chwn", "doOnRequest>>" + aLong);
                    }
                }).doOnEach(new Action1<Notification<? super File>>() {
                    @Override
                    public void call(Notification<? super File> notification) {
                        Log.e("chwn", "doOnEach>>kind:" + notification.getKind());
                        if(notification.isOnNext()){
                            Log.e("chwn", "doOnEach>>" + notification.getValue().toString());
                        }
                    }
                }).doOnNext(new Action1<File>() {
                    @Override
                    public void call(File file) {
                        Log.e("chwn", "doOnNext>>" + file.getName());
                    }
                }).doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        Log.e("chwn", "doOnSubscribe>>" + SystemClock.currentThreadTimeMillis());
                    }
                });
        observable12.subscribe(new Action1<File>() {
            @Override
            public void call(File file) {
                Log.e("chwn", "subscribe1>>" + file.getName());
            }
        });
        folders.add(new File(SDCARD + File.separator + "Pictures"+File.separator));
        observable12.subscribe(new Action1<File>() {
            @Override
            public void call(File file) {
                Log.e("chwn", "subscribe2>>" + file.getName());
            }
        });
    }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值