Android開発のRetrofitエンベロープ

7277 ワード

Android開発のRetrofitエンベロープ
前のページのretrofitに関する文章http://blog.csdn.net/anwanfei/article/details/58140327retrofitの解析と簡単な使い方はもう詳しくなりましたが、使いやすいものでもないし、あまり高くもないです.コードはよく抽出されていません.今日はパッケージを作りました.
一、ステップ
Step 1:Retrofitライブラリ追加の依存
compile 'com.squareup.retrofit2:retrofit:2.1.0'//Retrofit2     
compile 'com.squareup.retrofit2:converter-gson:2.1.0'//ConverterFactory Gson   
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'//ConverterFactory String   
ステップ2:受信サーバを作成してデータに戻すクラス(Ben)Step 3:ネットワーク要求を記述するためのインターフェースを作成する
public interface ICrewManagementService {
    @FormUrlEncoded
    @POST("employeeManger/query/list.do")
    Call getCrewList(@Field(Constants.PAGE) String page);
}
Step 4:ツールクラスを作成し、retrofitのインスタンスを作成し、ネットワーク要求インターフェースのインスタンスを取得する
public class HttpUtils {
    private final static HttpUtils instance = new HttpUtils();
    private HttpUtils() {
    }

    public static HttpUtils getDefault() {
        return instance;
    }
    //  ok   ,    header   
    private static final OkHttpClient httpClient = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @Override
                public Response intercept(@NonNull Chain chain) throws IOException {
                    Request.Builder builder = chain.request().newBuilder();
                    builder.addHeader(Constants.TOKEN, CacheUtils.getString(MyApplication.appContext, TOKEN))
                            .addHeader(Constants.USER_ID, CacheUtils.getString(MyApplication.appContext, Constants.ID))
                            .addHeader(Constants.AGENT, NetUtils.getUserAgent());
                    return chain.proceed(builder.build());
                }
            })
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();

    //  retrofit  
    private static final retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder()
            .baseUrl("http://116.62.152.191:8082/")
            .client(httpClient)//     
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    //          
    public  T getService(Class clazz) {
        return retrofit.create(clazz);
    }
}
Step 5:送信要求
retrofit2.Call call = HttpUtils.getDefault().getService(ICrewManagementService.class).getCrewList("1");
        //    
        call.enqueue(new MyCallback() {});

        //    
        Response execute = call.execute();
Step 3:ネットワークリターンデータ処理、同じ統一処理、異なるインターフェースコール処理
public abstract class MyCallback<T> implements Callback<T> {
    @Override
    public void onResponse(Call call, Response response) {
        int code = response.raw().code();
        String message = response.raw().message();
        if (code == 200) {
            onSuccess(response);
        } else if (code == 601) {
            //token  ,    
        } else if (code == 404) {
            onDataEmpty(message);
        } else {
            Toast.makeText(MyApplication.appContext, message, Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onFailure(Call call, Throwable t) {
        Toast.makeText(MyApplication.appContext, "    ", Toast.LENGTH_SHORT).show();
    }

    public abstract void onSuccess(Response response);
    public abstract void onDataEmpty(String message);
}
二、大坑1、retrofit中国語の文字化け問題はretrofitとrxjavaを使って、データを提出する時に注意してください.データの中に中国語がある時、バックグランドに伝わります.おそらく文字化けです.解決:①GET要求はPOSTに変えます.②パラメータQueryをField③に@FormUrlEnccodedを加えます.
2、headerを追加するとretrofitのインスタンスを作成する時に追加できますが、通常の量で書かなければいけません.これは需要を満たすことができなくて、OKhttp Clidentを作成する時にheaderを追加して実現する必要があります.