直接上demo
Observable observable1 = Observable.interval(1, TimeUnit.SECONDS);
Observable observable2 = Observable.interval(2, TimeUnit.SECONDS);
Observable observable3 = Observable.interval(3, TimeUnit.SECONDS);
List observableList = Arrays.asList(observable1, observable2, observable3);
Observable.combineLatest(observable1, observable2, observable3, new Function3() {
@Override
public String apply(Object o1, Object o2, Object o3) throws Exception {
// System.out.println("o1 = " + o1 + ",o2 = " + o2 + ",o3 = " + o3);
return "o1 = " + o1 + ", o2 = " + o2 + ", o3 = " + o3;
}
}).subscribe(System.out::println);
结果:
o1 = 1, o2 = 0, o3 = 0
o1 = 2, o2 = 0, o3 = 0
o1 = 2, o2 = 1, o3 = 0
o1 = 3, o2 = 1, o3 = 0
o1 = 4, o2 = 1, o3 = 0
o1 = 5, o2 = 1, o3 = 0
o1 = 5, o2 = 2, o3 = 0
o1 = 5, o2 = 2, o3 = 1
o1 = 6, o2 = 2, o3 = 1
o1 = 7, o2 = 2, o3 = 1
o1 = 7, o2 = 3, o3 = 1
o1 = 8, o2 = 3, o3 = 1
o1 = 8, o2 = 3, o3 = 2
o1 = 8, o2 = 4, o3 = 2
o1 = 9, o2 = 4, o3 = 2
o1 = 10, o2 = 4, o3 = 2
这个结果每个人打出来的可能不一样,其大概过程就是等observable1,observable2,observable3都发射一次数据后,然后3个observable其中的一个发送数据,则用改新数据替换该observable原来的数据,并触发一次Combine
具体的处理逻辑可以通过查看代码:
void innerNext(int index, T item) {
boolean shouldDrain = false;
synchronized (this) {
Object[] latest = this.latest;
if (latest == null) {
return;
}
Object o = latest[index];
int a = active;
if (o == null) {
active = ++a;
}
latest[index] = item;
if (a == latest.length) {
queue.offer(latest.clone());
shouldDrain = true;
}
}
if (shouldDrain) {
drain();
}
}
当当前的数据为空的时候activie++,当达到传进来observable数量的时候触发drain