2016-01-19 22 views
1

當一切正常時,我的服務器返回域java對象,但在出現錯誤時返回ErrorResponse對象。 (編輯:服務器返回HTTP代碼40x,並帶有錯誤信息的json主體) 如何在改造2 + rx-android上註冊全局錯誤轉換器以避免在每次調用時都做同樣的事情?如何在retrofit 2 + rx-android上註冊全局錯誤轉換器?

目前我正在做這樣在每次調用:

MyApiRx.doSomething(params) 
    .subscribeOn(Schedulers.io()) 
    .subscribe(response -> responseHandler(), 
      throwable -> { 
       HttpException err = (HttpException) throwable; 
       Converter<ResponseBody, ErrorResponse> ec = retrofit.responseConverter(ErrorResponse.class, new Annotation[]{}); 
       ErrorResponse errorResponse = ec.convert(err.response().errorBody()); 
      }); 

也許我應該寫一個自定義CallAdapterFactory會自動處理這個問題,並會返回一個可觀察與onerror的(錯誤響應錯誤),而不是股票onError(Throwable t)?

有關如何實現此目的的任何想法?

這是一個好主意嗎?

+0

檢查出這個要點https://gist.github.com/rahulgautam/25c72ffcac70dacb87bd和這個github問題https://github.com/square/retrofit/issues/1102 – LordRaydenMK

回答

1

您可以使用的Observable有幾種有趣的方法。尤其是你應該看看這兩個:

onErrorResumeNext(Func1<Throwable, Observable> resumeFunction)

doOnError(Action1<Throwable> onError)

而且因爲我沒有看到(在你的例子)需要另一個Observable到過流增益控制,後者一個可能會對你更好。

你可以做的是創造條件,包裹處理您的錯誤(例如這樣)類:

public static class Response { 
    private static final Action1<Throwable> ERROR_HANDLER = new Action1<Throwable>() { 
     @Override 
     public void call(Throwable throwable) { 
      HttpException err = (HttpException) throwable; 
      Converter<ResponseBody, ErrorResponse> ec = retrofit.responseConverter(ErrorResponse.class, new Annotation[]{}); 
      ErrorResponse errorResponse = ec.convert(err.response().errorBody()); 
     } 
    }; 

    public static Action1<Throwable> handleError() { 
     return ERROR_HANDLER; 
    } 
} 

然後用打電話給你的API:

MyApiRx.doSomething(params) 
    .subscribeOn(Schedulers.io()) 
    .doOnError(Response.handleError()) 
    .subscribe(response -> responseHandler()); 
+0

謝謝你的建議。我會試試看。儘管我看到這個方法有兩個問題:1.您建議的類/方法不能是靜態的,因爲它們需要「改造」的實例。 2.對於每一個請求,我仍然必須要做.OnError。 – pakman

+0

至於第一個問題 - 它仍然可以是靜態的,只要你得到你的'Retrofit'實例就需要初始化它。如果你正在使用某種依賴注入框架(例如匕首),那將特別容易。至於後一個問題:你將不得不做一些事情。如果你不喜歡'doOnError',你應該可以使用'compose'來替代([這裏是](http://blog.danlew.net/2015/03/02/dont-break-the-chain/))如果你需要參考,那麼Dan Lew對這個函數的好文章)。 –