rx.Observable.switchOnNext(Observable>)的行为与JavaDoc中描述的大理石图不同。
如果我在下面尝试
public static void main(String[] args) throws Exception {
Observable<Long> o1 = Observable.interval(200L, TimeUnit.MILLISECONDS);
Observable<Long> o2 = Observable.interval(500L, TimeUnit.MILLISECONDS)
.map(value -> value * 10);
Observable.switchOnNext(Observable.just(o1, o2)).subscribe(System.out::println);
Thread.sleep(2000L);
}
大理石图显示结果可能如下所示。
| time | 0 | 200 | 400 | 500 | 1000 | 1500 |.....|
|--------|-----|------|-------|------|--------|------|-----|
| o1 | | 0 | 1 |.... | ... | ... | ... |
| o2 | | | | 0 | 10 | 20 | ... |
| result | | 0 | 1 | 0 | 10 | 20 | ... |
但结果变为0,10,20 ......等等,如下所示
| time | 0 | 200 | 400 | 500 | 1000 | 1500 |.....|
|--------|-----|------|-------|------|--------|------|-----|
| o1 | | 0 | 1 |.... | ... | ... | ... |
| o2 | | | | 0 | 10 | 20 | ... |
| result | | | | 0 | 10 | 20 | ... |
此外,如果我将o1反转为o2,例如Observable.just(o1, o2)
至Observable.just(o2, o1)
,
结果是只发出了o1的值。
这是正确的行为吗?
如果它是以太JavaDoc会出错或者程序错了,我会创建问题。
或者,我是否误解了描述?
我正在使用RxJava 1.1.5
答案 0 :(得分:5)
我猜Javadoc在这种情况下是正确的。您还必须将上部水平线解释为时间。因此,您向switchOnNext
提供的内容是Observable
,其中包含第一个Observable o1
,紧接着是另一个Observable o2
。所以在大理石图中,左对角线代表o1
,右对角线代表o2
。由于后者在前者后立即 ,前者被丢弃,这就是为什么你只在输出中看到后者。
为了获得大理石图中的预期行为,您可以将Observable.just(o1, o2)
替换为
Observable.timer(100L, TimeUnit.MILLISECONDS).map(l -> o1)
.concatWith(Observable.timer(600L, TimeUnit.MILLISECONDS).map(l -> o2));
或其他任何行。
实际使用此方法是取消订阅第一个Observable
,当第二个滚动并订阅第二个。