2017-10-14 116 views
0

因此,我有一個非常基本的RxJava觀察器流的工作流,其中我要求改進的東西,成功的響應我吐司成功味精和錯誤我吐司錯誤味精。在RxJava2中沒有實現onError錯誤,即使它實現

我以下,參照的情況是錯誤的情況下我期望從API錯誤味精,我將其轉換成用戶可讀取單詞而顯示爲Toast,如下圖所示,當我使用doOnNextdoOnError方法這種方式,與錯誤崩潰提及。

我已經添加了throwExceptionIfFailure方法,它顯示了我如何轉換可讀的消息和控制檯指向錯誤的行。

registerNFCTag(body) 
       .map(result -> throwExceptionIfFailure(result)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnNext(result -> { 
        toggleLoaders(true);       
       appToast(getString(R.string.done_msg) + tagName); 
       }) 
       .doOnError(throwable -> { 
        Toasty.error(this, throwable.getLocalizedMessage()).show(); 
        toggleLoaders(true); 
       }) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(); 

錯誤如果這還不夠,我也可以發佈stacktrace。

java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling. 

ThrowExceptionIfFailure方法。

public <T> T throwExceptionIfFailure(T res) { 

    Response result = (Response<?>) res; 
    if (!result.isSuccessful()) { 
     try { 
      String msg = result.errorBody().string(); 
      Log.d(TAG, "throwExceptionIfFailure: "+msg); 
      if (result.code() == 401 || result.code() == 403) { 
       invalidateToken(); 
       msg = context.getString(R.string.invalid_credential); 
      } 
      else if (result.code() == 502) 
       msg = context.getString(R.string.server_down); 
      else if (result.code() == 422) 
       msg = context.getString(R.string.invalid_domain); 
      else if (result.code() == 500) 
       msg = context.getString(R.string.internal_server_error_500_msg); 
      else if (result.code() == 451) 
------><>>>>>> expected error msg works well with the case mentioned below with throwable in subscribe itself. 
       msg = context.getString(R.string.toast_tag_already_registered_error); 

      if (result.code() == 403) 
       throw new TokenException(); 
      else 
------>>>>>below line where console points error     
       throw Exceptions.propagate(new RuntimeException(msg)); 

     } catch (Throwable e) { 
      throw Exceptions.propagate(e); 
     } 
    } else { 
     return res; 
    } 
} 

但同樣的事情我訂閱這種方式,它工作正常,我看到錯誤信息如預期的烤。

registerNFCTag(body) 
       .map(result ->throwExceptionIfFailure(result)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(
         result -> { 
          toggleLoaders(true); 
          appToast(getString(R.string.done_msg) + tagName); 
         } 
         , throwable -> { 
          Toasty.error(this, throwable.getLocalizedMessage()).show(); 
          toggleLoaders(true); 
         }); 

在RxJava2世界仍然是新手,所以幫助我瞭解差異。先謝謝你。

+0

錯誤處理需要在'subscribe()'中作爲第二個參數完成。如果它不存在,那麼你會得到一個錯誤未被處理的通知。 'doOnError()'實際上並不是一個錯誤處理程序,儘管它的名字有其含義。 –

+0

好吧,所以在第一種情況下,我應該如何處理doOnError()中的錯誤? –

+0

爲什麼你不喜歡你在問題結尾發佈的工作示例?你的問題具體是什麼? – azizbekian

回答