2017-10-19 83 views
0

我訂閱熱可觀察,然後應用timeout運營商,但我不想取消訂閱TimeoutException時,只產生特殊項目(我知道源將最終發出新的項目)。我怎樣才能做到這一點?RxJava超時沒有退訂源

我試圖結合超時與onErrorReturn但這又導致onComplete呼叫用戶。

回答

0

發佈,超時和重試(改編自my older answer):

Observable<Long> source = 
    Observable.just(100L, 200L, 500L, 1000L, 5000L, 5500L, 6000L) 
    .flatMap(v -> Observable.timer(v, TimeUnit.MILLISECONDS).map(a -> v)); 

source.publish(co -> 
    co.timeout(750, TimeUnit.MILLISECONDS, 
     Observable.just(-1L) 
     .concatWith(Observable.error(new RuntimeException())) 
    ) 
    .retry() 
).blockingForEach(System.out::println); 
+0

就像一個魅力。在我的情況下,源已經很熱,所以不需要使用發佈。我所缺少的是concatWith()和retry()的組合,這是我認爲的關鍵。 – O10