關於RetrofitUtil網路框架封裝,讓你事半功倍
阿新 • • 發佈:2018-12-21
上一篇文章講解了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