RxJava的join函数官方表述比较模糊,较难理解。研究了一些时间后终于明白到底是真么回事,先上代码:
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Observer;
import rx.functions.Func1;
import rx.functions.Func2;
public class JoinTest {
public static void main(String argv[]) {
/*
* zip()和merge()方法作用在发射数据的范畴内,在决定如何操作值之前有些场景我们需要考虑时间的。
* RxJava的join()函数基于时间窗口将两个Observables发射的数据结合在一起。
*
*
*/
Observable<Long> ob1 = Observable.interval(1, TimeUnit.SECONDS);
Observable<Long> ob2 = Observable.interval(1, TimeUnit.SECONDS);
/**
* 第二个Observable和源Observable结合。
* Func1参数:在指定的由时间窗口定义时间间隔内,源Observable发射的数据和从第二个Observable发射的数据相互配合返回的Observable。
* Func1参数:在指定的由时间窗口定义时间间隔内,第二个Observable发射的数据和从源Observable发射的数据相互配合返回的Observable。
* Func2参数:定义已发射的数据如何与新发射的数据项相结合。
*/
ob1.join(ob2, new Func1<Long, Observable<Long>>() {
@Override
public Observable<Long> call(Long aLong) {
return Observable.timer(5, TimeUnit.SECONDS);
}
}, new Func1<Long, Observable<Long>>() {
@Override
public Observable<Long> call(Long aLong) {
return Observable.timer(10, TimeUnit.SECONDS);
}
}, new Func2<Long, Long, String>() {
@Override
public String call(Long aLong, Long aLong2) {
return "aLong2 = " + aLong + ",aLong2 = " + aLong2;
}
}).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
System.out.println("Observable completed");
}
@Override
public void onError(Throwable e) {
System.out.println("Oh,no! Something wrong happened!" + e);
}
@Override
public void onNext(String item) {
System.out.println("Item is " + item);
}
});
while (true) ;
}
}
这段代码输出是这样子的:
Item is aLong2 = 0,aLong2 = 0
Item is aLong2 = 1,aLong2 = 0
Item is aLong2 = 0,aLong2 = 1
Item is aLong2 = 1,aLong2 = 1
Item is aLong2 = 2,aLong2 = 0
Item is aLong2 = 2,aLong2 = 1
Item is aLong2 = 0,aLong2 = 2
Item is aLong2 = 1,aLong2 = 2
Item is aLong2 = 2,aLong2 = 2
Item is aLong2 = 3,aLong2 = 0
Item is aLong2 = 3,aLong2 = 1
Item is aLong2 = 3,aLong2 = 2
Item is aLong2 = 0,aLong2 = 3
Item is aLong2 = 1,aLong2 = 3
Item is aLong2 = 2,aLong2 = 3
Item is aLong2 = 3,aLong2 = 3
Item is aLong2 = 4,aLong2 = 0
Item is aLong2 = 4,aLong2 = 1
Item is aLong2 = 4,aLong2 = 2
Item is aLong2 = 4,aLong2 = 3
Item is aLong2 = 0,aLong2 = 4
Item is aLong2 = 1,aLong2 = 4
Item is aLong2 = 2,aLong2 = 4
Item is aLong2 = 3,aLong2 = 4
Item is aLong2 = 4,aLong2 = 4
Item is aLong2 = 5,aLong2 = 0
Item is aLong2 = 5,aLong2 = 1
Item is aLong2 = 5,aLong2 = 2
Item is aLong2 = 5,aLong2 = 3
Item is aLong2 = 5,aLong2 = 4
Item is aLong2 = 0,aLong2 = 5
Item is aLong2 = 1,aLong2 = 5
Item is aLong2 = 2,aLong2 = 5
Item is aLong2 = 3,aLong2 = 5
Item is aLong2 = 4,aLong2 = 5
Item is aLong2 = 5,aLong2 = 5
Item is aLong2 = 6,aLong2 = 0
Item is aLong2 = 6,aLong2 = 1
Item is aLong2 = 6,aLong2 = 2
Item is aLong2 = 6,aLong2 = 3
Item is aLong2 = 6,aLong2 = 4
Item is aLong2 = 6,aLong2 = 5
Item is aLong2 = 2,aLong2 = 6
Item is aLong2 = 3,aLong2 = 6
Item is aLong2 = 4,aLong2 = 6
Item is aLong2 = 5,aLong2 = 6
Item is aLong2 = 6,aLong2 = 6
Item is aLong2 = 7,aLong2 = 0
Item is aLong2 = 7,aLong2 = 1
Item is aLong2 = 7,aLong2 = 2
Item is aLong2 = 7,aLong2 = 3
Item is aLong2 = 7,aLong2 = 4
Item is aLong2 = 7,aLong2 = 5
Item is aLong2 = 7,aLong2 = 6
Item is aLong2 = 3,aLong2 = 7
Item is aLong2 = 4,aLong2 = 7
Item is aLong2 = 5,aLong2 = 7
Item is aLong2 = 6,aLong2 = 7
Item is aLong2 = 7,aLong2 = 7
Item is aLong2 = 8,aLong2 = 0
Item is aLong2 = 8,aLong2 = 1
Item is aLong2 = 8,aLong2 = 2
Item is aLong2 = 8,aLong2 = 3
Item is aLong2 = 8,aLong2 = 4
Item is aLong2 = 8,aLong2 = 5
Item is aLong2 = 8,aLong2 = 6
Item is aLong2 = 8,aLong2 = 7
Item is aLong2 = 4,aLong2 = 8
Item is aLong2 = 5,aLong2 = 8
Item is aLong2 = 6,aLong2 = 8
Item is aLong2 = 7,aLong2 = 8
Item is aLong2 = 8,aLong2 = 8
Item is aLong2 = 9,aLong2 = 0
Item is aLong2 = 9,aLong2 = 1
Item is aLong2 = 9,aLong2 = 2
Item is aLong2 = 9,aLong2 = 3
Item is aLong2 = 9,aLong2 = 4
Item is aLong2 = 9,aLong2 = 5
Item is aLong2 = 9,aLong2 = 6
Item is aLong2 = 9,aLong2 = 7
Item is aLong2 = 9,aLong2 = 8
Item is aLong2 = 5,aLong2 = 9
Item is aLong2 = 6,aLong2 = 9
Item is aLong2 = 7,aLong2 = 9
Item is aLong2 = 8,aLong2 = 9
Item is aLong2 = 9,aLong2 = 9
Item is aLong2 = 10,aLong2 = 0
Item is aLong2 = 10,aLong2 = 1
Item is aLong2 = 10,aLong2 = 2
Item is aLong2 = 10,aLong2 = 3
Item is aLong2 = 10,aLong2 = 4
Item is aLong2 = 10,aLong2 = 5
Item is aLong2 = 10,aLong2 = 6
Item is aLong2 = 10,aLong2 = 7
Item is aLong2 = 10,aLong2 = 8
Item is aLong2 = 10,aLong2 = 9
Item is aLong2 = 6,aLong2 = 10
Item is aLong2 = 7,aLong2 = 10
Item is aLong2 = 8,aLong2 = 10
Item is aLong2 = 9,aLong2 = 10
Item is aLong2 = 10,aLong2 = 10
Item is aLong2 = 11,aLong2 = 1
Item is aLong2 = 11,aLong2 = 2
Item is aLong2 = 11,aLong2 = 3
Item is aLong2 = 11,aLong2 = 4
Item is aLong2 = 11,aLong2 = 5
Item is aLong2 = 11,aLong2 = 6
Item is aLong2 = 11,aLong2 = 7
Item is aLong2 = 11,aLong2 = 8
Item is aLong2 = 11,aLong2 = 9
Item is aLong2 = 11,aLong2 = 10
Item is aLong2 = 7,aLong2 = 11
Item is aLong2 = 8,aLong2 = 11
Item is aLong2 = 9,aLong2 = 11
Item is aLong2 = 10,aLong2 = 11
Item is aLong2 = 11,aLong2 = 11
由结果可以分析出:
join的效果类似于排列组合,
两个数据源left和right都根据自己的节奏来发射数据,
当left发射时,会和right的定义的时间间隔内发射的所有数据都进行互动。
比如当left发出11时候,和right在时间间格10秒内发出的1-10组合;right在这段时间内发射了10个,就会调用10次onNext()。
反之,当right发射数据时候,会和left定义的时间间隔内发射的所有数据也都进行互动。
比如当right发出10时候,和left在时间间隔5秒内发出的6-10组合;left在这段时间发射了5个数据,也会调用5次onNext()。
现在你们明白了吗?