1. 程式人生 > >關於RetrofitUtil網路框架封裝,讓你事半功倍

關於RetrofitUtil網路框架封裝,讓你事半功倍

上一篇文章講解了Retrofit基礎例項,接下來對它進行框架的封裝,讓呼叫更加的簡單,高效。請看一下工程的結構。 一、首先NetKitCallBack中定義了回撥的介面包含成功,警告以及錯誤的提示 public void success(T data); public void warning(T data, Integer status, @NonNull String message, String messageLevel); public void error(Throwable t);

二、然後在ResultData中定義的是本公司介面返回資料的標準格式,這個大家需要依照各公司返回格式而定。

public class ResultData<T> {
    /**
     * status : 3200
     * data : {}
     * message : {"message":"","messageLevel":""}
     */
}

三、然後在OkHttpUtil類中定義了一些請求網路時設定連線超時,token,頭資訊等資料,因為retrofit的封裝基於okhttp實現的。

class OkHttpUtil {
    private static OkHttpClient client;
    OkHttpUtil(int connectTimeOut, int writeTimeOut, int readTimeOut, final String stokenkey, final String tid) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(connectTimeOut, TimeUnit.SECONDS)
                .writeTimeout(writeTimeOut, TimeUnit.SECONDS)
                .readTimeout(readTimeOut, TimeUnit.SECONDS);
        if (stokenkey != null && !stokenkey.equals("")) {
            builder.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    // 頭資訊新增stokenkey
                    Request request = chain.request();
                    Request.Builder builder1 = request.newBuilder();
                    Request build = builder1.addHeader("st", stokenkey).addHeader("tid", tid).build();
                    return chain.proceed(build);
                }
            });
        }
        builder.addNetworkInterceptor(new StethoInterceptor());
        client = builder.build();
    }
    OkHttpClient getClient() {
        return client;
    }
}

四、NetKit類中例項化retrofit,在回撥中處理伺服器返回的資訊

public static NetKit getInstance() {
    if (instance == null) {
        synchronized (NetKit.class) {
            if (instance == null) {
                instance = new NetKit();
            }
        }
    }
    return instance;
}
/**
 * 通用於沒有返回介面資料格式
 * @param call     call
 * @param callBack callBack
 * @return 返回值為null
 */
public <T> T actionWithoutRestJson(Call<T> call, final
NetKitCallBack<T> callBack) {
    call.enqueue(new Callback<T>() {
        @Override
        public void onResponse(Call<T> call, Response<T> response) {
            T resultData = response.body();
            if (resultData == null) {
                int code = response.code();
                switch (code) {
                    case 404:
                        callBack.warning(null, code, "目標檔案不存在", null);
                        break;
                    case 500:
                        callBack.warning(null, code, "伺服器出錯,請聯絡管理員", null);
                        break;
                    case 502:
                        callBack.warning(null, code, "服務無法連線,請聯絡管理員", null);
                        break;
                    case 503:
                        callBack.warning(null, code, "伺服器由於維護或者負載過重未能應答", null);
                        break;
                    default:
                        callBack.warning(null, code, "未知錯誤", null);
                        break;
                }
                return;
            }
            callBack.success(resultData);
        }

        @Override
        public void onFailure(Call<T> call, Throwable e) {
            String error = "";
            if (e instanceof TimeoutException || e instanceof SocketTimeoutException
                    || e instanceof ConnectException || e instanceof UnknownHostException) {
                error = "連線超時,請檢查網路連線";
            } else if (e instanceof JsonSyntaxException) {
                error = "返回Json格式出錯";
                //假如導致這個異常觸發的原因是伺服器的問題,那麼應該讓伺服器知道,所以可以在這裡
                //選擇上傳原始異常描述資訊給伺服器
            }
            if (error.equals(""))
                callBack.error(e);
            else callBack.warning(null, 0, error, null);
        }
    });
    return null;
}

五、定義業務邏輯介面

public interface LogInterface {
    /**
     * 定義了一個獲取使用者資訊的業務方法,並且通過註解的方式
     * 指定了方法呼叫的時候所請求的url路徑
     */
    @GET("test")
    Call<UserInfo> getUserInfo();

    //動態路徑替換使用型參替換
    @GET("test/{a}")
    Call<UserInfo> test(@Path("a")String params, String p1);

    //使用Query註解替換?後面的引數
    @GET("test/search")
    Call<UserInfo> search(@Query("keyword") String params, @Query("sort") String p1);

    //使用QueryMap註解替換?後面的多個引數
    //最終會將map中的所有key/value拼接到url的?後面
    @GET("test/search")
    Call<UserInfo> search1 (@QueryMap HashMap<String,String > map);

    //登入的業務方法
    //使用@Field設定請求體引數
    @FormUrlEncoded //配置隊請求體引數進行url編碼
    @POST("login")
    Call<User> login(@Field("username") String p1, @Field("password")String p2);
}

6、根據封裝的框架進行呼叫解析資料

anInterface = NetKit.getInstance().createInterface(url, LogInterface.class);
NetKit.getInstance().actionWithoutRestJson(anInterface.getUserInfo(), new NetKitCallBack<LogInterface.UserInfo>() {
    @Override
    public void success(LogInterface.UserInfo userInfo) {
        tv.setText(userInfo.toString());
    }
    @Override
    public void warning(LogInterface.UserInfo data, Integer status, @NonNull String message, String messageLevel) {}
    @Override
    public void error(Throwable t) {}
});

七、總結 至此封裝Retrofit後呼叫邏輯已經完成了,更多的各種註解形式的呼叫大家在專案中可以看到,藉助tomcat開啟服務,將apitest.war檔案放到tomcat的此路徑下  D:\download\apache-tomcat-8.0.33\webapps,再點選startup.bat雙擊開啟即可除錯執行資料。此demo下載路徑:https://download.csdn.net/download/lou_liang/10784884