1. 程式人生 > >[RxJava學習]操作符Do的使用

[RxJava學習]操作符Do的使用

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());
            }
        });
    }