2017-02-10 40 views
1

我有一個簡單操作,其中正在執行的API調用,結果是一個Observable發出響應:超時如果沒有項目發射之後指定的時間

apiService.getTeam() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Subscriber<Response>() { 
      ... 
    }); 

我想提供一些反饋如果幾秒鐘後沒有物品被髮射,則向用戶發送。我知道.timeout()操作符,但是這將應用於每個項目,所以即使發射了幾個項目,在最後一個可用項目發出後幾秒鐘,超時也會導致錯誤。

我只想在沒有項目發射時超時操作。有沒有簡單的方法來做到這一點?

+0

請檢查此http://bytes.babbel.com/en/articles/2016-03-16-retrofit2-rxjava-error-handling.html改造錯誤處理。 – Raghunandan

回答

0

以下代碼段可以解決你的問題:

public static void main(String[] args) { 
    boolean itemEmitted[] = { false }; 
    long identifier = -1l; 
    Observable.interval(10, TimeUnit.SECONDS) 
      .mergeWith(Observable.just(identifier).delay(5, TimeUnit.SECONDS)) 
      .map(v -> { 
       if (!itemEmitted[0] && v == identifier) { // item is not emitted and a timeout occurs 
        throw new RuntimeException("timeout"); 
       } 
       itemEmitted[0] = true; 
       return v; 
      }).filter(v -> v != identifier).toBlocking() 
      .subscribe(v -> System.out.println(v)); 

} 

Observable.interval是您的源Observable發出該合併Observable.justdelay項目 - 其組合作用類似於timeout。輸出Observablemap,以檢查是否發出實際項目或是否發生超時identifier。如果超時,則拋出Exception。稍後輸出爲filter ed以從發射項目列表中移除標識符。

您可以通過修改初始Observable.interval中的值來玩此代碼。

2

有一個timeout過載,可以使用超時第一元件和不超時,其餘:

Observable.never() 
.timeout(() -> Observable.timer(1, TimeUnit.SECONDS), e -> Observable.never()) 
.toBlocking() 
.subscribe(System.out::println, Throwable::printStackTrace); 

這裏,第二參數簡單地返回一個可觀察,將永遠不會發出且因此隨後的元件贏得」 t超時。

相關問題