RxJava的switchOnNext方法不像JavaDoc描述的那样

时间:2016-05-23 15:46:16

标签: rx-java

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

1 个答案:

答案 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,当第二个滚动并订阅第二个