2016-05-23 113 views
0

rx.Observable.switchOnNext(Observable>)不像所描述的JavaDoc中的大理石图表那样工作。RxJava的switchOnNext方法不像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), 的结果将是仅发射了数值。

这是正确的行为?

如果是乙醚JavaDoc将是错误的或程序将是错误的,我会创建该问题。

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

我使用RxJava 1.1.5

回答

4

我猜的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当第二个滚动,并订阅第二个,而不是

+0

谢谢你的帮助!现在,我知道我误解了'switchOnNext'方法,并理解'switchOnNext'。由于观测数据是同时订阅的,结果并不符合我的预期。 – otal

相关问题