一、okhttp的使用
1、添加庫
compile 'com.squareup.okhttp3:okhttp:3.4.1'2、java代碼中添加
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); return response.body().string(); }二、okhttp的簡單封裝
1、OkHttpHelper類設成單例
private static OkHttpHelper mInstance;
private OkHttpHelper(){ };
public static OkHttpHelper getInstance(){ return mInstance; }
static { mInstance = new OkHttpHelper(); }2、封裝get請求和post請求(所需參數,一個url,Map參數,一個回調)
public void get(String url,BaseCallback callback){ Request request = buildGetRequest(url); request(request,callback); } public void post(String url,Map<String,String> param, BaseCallback callback){ Request request = buildPostRequest(url,param); request(request,callback); }
3、封裝執行請求方法request(需要傳遞一個request對象和一個callback對象)
public void request(final Request request,final BaseCallback callback){ callback.onBeforeRequest(request); mHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { callbackFailure(callback, request, e); } @Override public void onResponse(Response response) throws IOException { // callback.onResponse(response); callbackResponse(callback,response); if(response.isSuccessful()) { String resultStr = response.body().string(); Log.d(TAG, "result=" + resultStr); if (callback.mType == String.class){ callbackSuccess(callback,response,resultStr); } else { try { Object obj = mGson.fromJson(resultStr, callback.mType); callbackSuccess(callback,response,obj); } catch (com.google.gson.JsonParseException e){ // Json解析的錯誤 callback.onError(response,response.code(),e); } } } else { callbackError(callback,response,null); } } }); }
4、構建GetRequest和PosRequest,這兩個方法都要調用buildRequest方法,通過buildRequest方法中的HttpMethodType判斷是GetReques還是PosRequest
private Request buildPostRequest(String url,Map<String,String> params){ return buildRequest(url,HttpMethodType.POST,params); } private Request buildGetRequest(String url){ return buildRequest(url,HttpMethodType.GET,null); }
private Request buildRequest(String url,HttpMethodType methodType,Map<String,String> params){ Request.Builder builder = new Request.Builder() .url(url); if (methodType == HttpMethodType.POST){ RequestBody body = builderFormData(params); builder.post(body); } else if(methodType == HttpMethodType.GET){ builder.get(); } return builder.build(); }
enum HttpMethodType{ GET, POST, }5、封裝方法builderFormData(返回requestBody)
private RequestBody builderFormData(Map<String,String> params){ FormEncodingBuilder builder = new FormEncodingBuilder(); if(params !=null){ for (Map.Entry<String,String> entry :params.entrySet() ){ builder.add(entry.getKey(),entry.getValue()); } } return builder.build(); }6、request響應成功或者失敗結果要交由主線程操作,所以要封裝callbackResponse和callbackFailure方法,其中callbackResponse又有響應正確和響應錯誤,所以還需封裝callbackSuccess方法和callbackError方法。
private void callbackFailure(final BaseCallback callback , final Request request, final IOException e ){ mHandler.post(new Runnable() { @Override public void run() { callback.onFailure(request,e); } }); } private void callbackResponse(final BaseCallback callback , final Response response ){ mHandler.post(new Runnable() { @Override public void run() { callback.onResponse(response); } }); }
private void callbackSuccess(final BaseCallback callback , final Response response, final Object obj ){ mHandler.post(new Runnable() { @Override public void run() { callback.onSuccess(response, obj); } }); } private void callbackError(final BaseCallback callback , final Response response, final Exception e ){ mHandler.post(new Runnable() { @Override public void run() { callback.onError(response,response.code(),e); } }); }7、編寫callback類
public abstract class BaseCallback <T> { public Type mType; static Type getSuperclassTypeParameter(Class<?> subclass) { Type superclass = subclass.getGenericSuperclass(); if (superclass instanceof Class) { throw new RuntimeException("Missing type parameter."); } ParameterizedType parameterized = (ParameterizedType) superclass; return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); } public BaseCallback() { mType = getSuperclassTypeParameter(getClass()); } public abstract void onBeforeRequest(Request request); public abstract void onFailure(Request request, Exception e) ; /** *請求成功時調用此方法 * @param response */ public abstract void onResponse(Response response); /** * * 狀態碼大於200,小於300 時調用此方法 * @param response * @param t * @throws IOException */ public abstract void onSuccess(Response response,T t) ; /** * 狀態碼400,404,403,500等時調用此方法 * @param response * @param code * @param e */ public abstract void onError(Response response, int code,Exception e) ; }如加載數據時需要加入對話框,則另寫一個callback繼承basecallback
public abstract class SpotsCallBack<T> extends BaseCallback<T> { private Context mContext; private SpotsDialog mDialog; public SpotsCallBack(Context context){ mContext = context; initSpotsDialog(); } private void initSpotsDialog(){ mDialog = new SpotsDialog(mContext,"拼命加載中..."); } public void showDialog(){ mDialog.show(); } public void dismissDialog(){ mDialog.dismiss(); } public void setLoadMessage(int resId){ mDialog.setMessage(mContext.getString(resId)); } @Override public void onFailure(Request request, Exception e) { dismissDialog(); } @Override public void onBeforeRequest(Request request) { showDialog(); } @Override public void onResponse(Response response) { dismissDialog(); } }