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

ota*_*tal 0 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);
}
Run Code Online (Sandbox Code Playgroud)

大理石图显示结果可能如下所示.

| time   | 0   | 200  | 400   | 500  | 1000   | 1500 |.....|
|--------|-----|------|-------|------|--------|------|-----|
| o1     |     | 0    | 1     |....  | ...    | ...  | ... |
| o2     |     |      |       | 0    |  10    | 20   | ... |
| result |     | 0    | 1     | 0    |  10    | 20   | ... |
Run Code Online (Sandbox Code Playgroud)

但结果变为0,10,20 ......等等如下

| time   | 0   | 200  | 400   | 500  | 1000   | 1500 |.....|
|--------|-----|------|-------|------|--------|------|-----|
| o1     |     | 0    | 1     |....  | ...    | ...  | ... |
| o2     |     |      |       | 0    |  10    | 20   | ... |
| result |     |      |       | 0    |  10    | 20   | ... |
Run Code Online (Sandbox Code Playgroud)

此外,如果我反向O1给O2像Observable.just(o1, o2)Observable.just(o2, o1),其结果将是,只有o1`s值发射.

这是正确的行为吗?

如果它是以太JavaDoc是错误的或程序是错误的,我将创建问题.

或者,我是否误解了描述?

我正在使用RxJava 1.1.5

Rva*_*est 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));
Run Code Online (Sandbox Code Playgroud)

或者沿着那条线的任何东西

真正的用途是取消订阅第一个,Observable当第二个滚动并订阅第二个.