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);解开,这个没什么影响。

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