2017-01-27 24 views
1

AIM:當某事發生變化時刷新適配器,但僅在用戶停止滾動列表時刷新。RxJava在doOnNext內部拋出失敗時重試

我想在doOnNext中拋出一個錯誤,以便我可以再等待並重試。但是,這不起作用。我可以看到異常正在拋出,但retryWhen似乎沒有做任何事情。

我在這裏做錯了什麼?

someObservable() 
    .observeOn(AndroidSchedulers.mainThread()) 
    .debounce(650, TimeUnit.MILLISECONDS) 
    .doOnNext(o -> { 
     if (isListScrolling()) { 
     throw new IllegalStateException(); 
     } 
    }) 
    .retryWhen(errors -> errors.flatMap(error -> Observable.timer(100, TimeUnit.MILLISECONDS))) 
    .subscribe(o -> refreshListNow()); 

UPDATEsomeObservableSubject(總線)我在觀察UI事件。

看到我的評論如下,因爲它似乎retry()這裏行不通怎麼一會想到(即重試不會造成光源自動重新發射的最後一個值,除非我也許使用BehaviorSubject - 這ISN這裏不適合)。

回答

0

你沒有提到什麼價值是有效的。所以我只是把它作爲這個例子的一個字符串。檢查doOnNext內的滾動狀態爲時已晚,因爲它們無法傳播回retryWhen。您可以簡單地使用flatMap來引發錯誤。

Observable.just("someValue") 
     .observeOn(AndroidSchedulers.mainThread()) 
     .debounce(650, TimeUnit.MILLISECONDS) 
     .flatMap((Func1<String, Observable<?>>) s -> { 
      if (isListScrolling()) { 
       // Still scrolling, pass error so we can retry in the next step 
       return Observable.error(new Exception()); 
      } 

      // Not scrolling, we can continue 
      return Observable.just("someValue"); 
     }) 
     .retry() 
     .subscribe(o -> refreshListNow()); 
+0

我已經試過上述變異,但是現在在「retryWhen」代碼似乎被觸發,即使沒有任何錯誤,然後認購似乎完全消失。 – strangetimes

+0

我應該補充說'可觀察'是一個主體(公共汽車)......也許這改變了事物? – strangetimes

+0

兩個小問題 - 'Observable.just(null)'在RxJava 2中不起作用,我會使用'.map'而不是'.flatMap'。一個主題可能會改變一些事情 - 引用[RxRelay的項目頁面](https://github.com/JakeWharton/RxRelay):「主題對於縮小非Rx API之間的差距非常有用,但它們有損於有狀態:當他們收到onComplete或onError時,他們不再可用於移動數據,這是可觀察的合同,有時候是期望的行爲,大多數情況下不是。 – ahmedre

相關問題