這一篇主要學習一下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);解開,這個沒什麼影響。