一、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(); } }