2016-05-23 28 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

相關問題