1

私のサーバーは、すべてがうまくいくとドメイン Java オブジェクトを返しますが、エラーが発生すると ErrorResponse オブジェクトを返します。(編集: サーバーは http コード 40x を返し、エラー情報を含む json 本体を返します) レトロフィット 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());
             });

おそらく、これを自動的に処理し、在庫の onError(Throwable t) の代わりに onError(ErrorResponse err) で Observable を返すカスタム CallAdapterFactory を作成する必要がありますか?

これを達成する方法についてのアイデアはありますか?

それは良い考えですか?

4

1 に答える 1

1

使用できる興味深いメソッドはいくつかありObservableます。特に、次の 2 つを確認する必要があります。

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());
于 2016-01-20T10:59:35.593 に答える