RxJava2深度學習(三)

這一篇主要學習一下zip操作符。
先了解一下zip操作符是什麼,能做什麼:
Zip通過一個函數將多個Observable發送的事件結合到一起,然後發送這些組合到一起的事件。它按照嚴格的順序應用這個函數。它只發射與發射數據項最少的那個Observable一樣多的數據。
舉個例子:
上游有兩根水管(Observable),其中一個發送事件 A B C,另外一個發送事件 1 2 3 4,zip操作符組合的順序是:
A1,B2,C3,這就是下游能夠接收到的事件了。下游不會接收到4的。

看一下代碼:
這是第一個Observable(沒有加線程休眠):

Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d("----", "subscribe: 發送:1");
                e.onNext(1);
//                Thread.sleep(1000);

                Log.d("----", "subscribe: 發送:2");
                e.onNext(2);
//                Thread.sleep(1000);

                Log.d("----", "subscribe: 發送:3");
                e.onNext(3);
//                Thread.sleep(1000);

                Log.d("----", "subscribe1:完成 ");
                e.onComplete();
            }
        })
        .subscribeOn(Schedulers.io());

第二個Observable:

Observable<String> observable2 = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                Log.d("----", "subscribe: 發送one");
                e.onNext("one");
//                Thread.sleep(1000);

                Log.d("----", "subscribe: 發送two");
                e.onNext("two");
//                Thread.sleep(1000);

                Log.d("----", "subscribe: 發送three");
                e.onNext("three");
//                Thread.sleep(1000);

                Log.d("----", "subscribe: 發送four");
                e.onNext("four");
//                Thread.sleep(1000);

                Log.d("----", "subscribe2: 完成");
                e.onComplete();
            }
        })
        .subscribeOn(Schedulers.io());

下游的接收者:

 Observable.zip(observable1, observable2, new BiFunction<Integer, String, String>() {
            @Override
            public String apply(Integer integer, String s) throws Exception {
                return integer + ":" +s;
            }
        }).subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("----", "onSubscribe: 訂閱");
            }

            @Override
            public void onNext(String s) {
                Log.d("----", "onNext: 接收到的信息:"+s);
            }

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

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

看一下Log輸出:

02-05 16:34:35.725 17865-17865/com.ckw.rxjava2demo D/----: onSubscribe: 訂閱
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: subscribe: 發送:1
02-05 16:34:35.755 17865-17917/com.ckw.rxjava2demo D/----: subscribe: 發送one
02-05 16:34:35.755 17865-17917/com.ckw.rxjava2demo D/----: subscribe: 發送two
02-05 16:34:35.755 17865-17917/com.ckw.rxjava2demo D/----: subscribe: 發送three
02-05 16:34:35.755 17865-17917/com.ckw.rxjava2demo D/----: subscribe: 發送four
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: onNext: 接收到的信息:1:one
02-05 16:34:35.755 17865-17917/com.ckw.rxjava2demo D/----: subscribe2: 完成
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: subscribe: 發送:2
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: onNext: 接收到的信息:2:two
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: subscribe: 發送:3
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: onNext: 接收到的信息:3:three
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: subscribe1:完成 
02-05 16:34:35.755 17865-17916/com.ckw.rxjava2demo D/----: onComplete: 

上游發送的消息是無序的,但是接收的消息是順序是固定的,而且最後都是三條。
如果想要發送有序,可以將上面的Thread.sleep(1000);解開,這個沒什麼影響。

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