这一篇主要学习一下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);解开,这个没什么影响。