Rxシリーズ学習ノート_okhttpブロッキングを使用してリターンリクエストを統一的に処理

6110 ワード

前に簡単なお願いをしました.しかし、apiのObservableのタイプはすべてResponseDataパッケージを行うことを発見しました.ResponseDataのコードは次のとおりです.

public class ResponseData {

    private String ErrorCode;
    private String ErrorMsg;
    private String Status;
    private T Data;

    public String getErrorCode() {
        return ErrorCode;
    }

    public void setErrorCode(String ErrorCode) {
        this.ErrorCode = ErrorCode;
    }

    public String getErrorMsg() {
        return ErrorMsg;
    }

    public void setErrorMsg(String ErrorMsg) {
        this.ErrorMsg = ErrorMsg;
    }

    public String getStatus() {
        return Status;
    }

    public void setStatus(String Status) {
        this.Status = Status;
    }

    public T getData() {
        return Data;
    }

    public void setData(T Data) {
        this.Data = Data;
    }

}

結果
 .flatMap(new Func1, Observable>>() {
                    @Override
                    public Observable> call(ResponseData checkDetailsDataResponseData) {
                        return request.getMyApi().getRecordDetail2(checkDetailsDataResponseData.getData().getSerialNumber());
                    }
                })

ここのflatMapでは、私たちのnewのFunc 1には小包のResponseDataが入っています.私たちの目標は、使用するときに私たちが望んでいるタイプに直接戻ることです.例えば、ここで私たちが望んでいるのはCheckDetailsDataオブジェクトです.では、私たちが最終的に変えなければならないのは次のようなモードです.戻ったデータは、外層を除去する必要のない小包を直接使用します.
new Func1, Observable...

これまでRxJavaとRetrofitを組み合わせたベストプラクティスを見たことがあるはずですが、ここでの処理方法はこうです.
1.まずRetrofit要求クラスに内部クラスHttpResultFuncを作成する
//      Http resultCode,  HttpResult Data         subscriber,   HttpResult       ResponseData.
private class HttpResultFunc<T> implements Func1<HttpResult<T>, T>{

    @Override
    public T call(HttpResult httpResult) {
        if (httpResult.getResultCode() != 0) {
            throw new ApiException(httpResult.getResultCode());
        }
        return httpResult.getData();
    }
}

2.具体的な使用
movieService.getTopMovie(start, count)
            .map(new HttpResultFunc>())
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);

以上のようにしても、データ統合処理要求の戻りを実現することができる.彼の異常などのデータはApiExceptionで処理されています.しかしこの中でmapではnewというオブジェクトに何度も行き、何度もお願いすると何度も創造します.文章の評論の下でこの問題を提起する人もいて、私のこの野菜と鶏は本当に蒙っていますが、仕方がなくてまだ直さなければなりません.彼はブロックを言ったので、私は調べてみました.文章はまだあります.Okhttpのブロッカーで直接ブロッキング処理が可能です.
 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okHttpClient =new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {

                        Request request = chain.request();
                        //       Response           Response
                        Response responseNew=filterResponse(request,chain);
                        return responseNew;
                    }
                })
                .addInterceptor(httpLoggingInterceptor)
                .build();
        retrofitBuild.client(okHttpClient);

リファレンス
http://blog.csdn.net/csdn_lqr/article/details/61420753