2017-02-24 100 views
0

我正在使用RxSearchView來將API搜索結果發送到recyclerview。但是,如果其中一個查詢失敗,則調用onError()(這是預期的),但訂閱作爲整體也會被取消。後續查詢根本不執行。RxJava:即使發生錯誤,也繼續下一次迭代

我該如何修改代碼,以便在查詢失敗並且下一個傳入查詢正常執行時阻止對onError()的調用?

這裏有一個代碼片段:

subscription = RxSearchView.queryTextChanges(searchView) 
       .debounce(500, MILLISECONDS) 
       .filter(charSequence -> !TextUtils.isEmpty(charSequence)) 
       .map(CharSequence::toString) 
       .subscribeOn(AndroidSchedulers.mainThread()) 
       .observeOn(Schedulers.io()) 
       .switchMap(query -> apiService.getSearchResults(query)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<SearchResponse>() { 
        @Override 
        public void onCompleted() { 
        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(SearchResponse searchResponse) { 
         if (searchResponse.getStatus().equals("OK")) { 
          //update Adapter 
         } else { 
          //update error views 
         } 
        } 

       }); 

P.S:我使用switchMap()讓老查詢的結果會被忽略,如果新的查詢結果已經到來。

+0

您只需將必要的錯誤處理邏輯(https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators)連線到apiService.getSearchResults(query)調用。 – nikis

回答

1

您必須處理此錯誤並返回對象。例如,您可以使用onErrorResumeNext運營商與apiService.getSearchResults(query)致電。你將返回什麼 - 取決於你,如果你願意,你甚至可以返回null,但更好的是創建一些可以攜帶響應狀態標誌和收到正常響應的包裝器。

喜歡的東西:

subscription = RxSearchView.queryTextChanges(searchView) 
      .debounce(500, MILLISECONDS) 
      .filter(charSequence -> !TextUtils.isEmpty(charSequence)) 
      .map(CharSequence::toString) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .observeOn(Schedulers.io()) 
      .switchMap(query -> apiService 
            .getSearchResults(query) 
            .onErrorResumeNext(error -> null) 
      ) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<SearchResponse>() { 
       @Override 
       public void onCompleted() { 
       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(SearchResponse searchResponse) { 
        if (searchResponse != null && searchResponse.getStatus().equals("OK")) { 
         //update Adapter 
        } else { 
         //update error views 
        } 
       } 

      }); 

當然,這是使用空,在現實中你需要編寫錯誤處理邏輯簡單的例子。更好地返回包裝,因爲如果使用RxJava 2,那麼它不支持null

+0

非常感謝。此外,如果我返回null並檢查onNext中的空SearchResponse?這是否是一個正確的方法? –

+0

它應該。但請記住,如果你遷移到RxJava 2,那麼你可以有不同的行爲 - https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#nulls – nikis

+0

我建議你使用'.onErrorResumeNext(錯誤 - > Observable.empty())',這樣你就不需要空檢查。 –

相關問題