android网络访问框架OkHttp的进一步封装
概述:
android网络框架之OKhttp
[1]
一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付
Square公司贡献(该公司还贡献了Picasso)
[2]
用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)
基础使用:
使用请看zhy大神博客
进一步封装:
不封装使用:
OkHttpClient client = new OkHttpClient(); RequestBody body = new FormEncodingBuilder() .add("type","1") .build(); Request request = new Request.Builder() .url(url) .post(body) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { if(response.isSuccessful()){ String json = response.body().string(); Type type = new TypeToken<List<Banner>>(){}.getType(); mBanner = mGson.fromJson(json,type); handler.sendEmptyMessage(1); } });
这样看起来是不是挺恶心人的,每次都这样写很累吧孩子,每次拿过来string的json串再自己解析很蛋疼吧!
如果你想直接拿到对象或者集合那就往下看。
封装使用:
httpHelper.get(Contants.API.SLIDE_LAYOUT_URL, new SpotsCallBack<List<Banner>>(getContext()){ @Override public void onSuccess(Response response, List<Banner> banners) { mBanner = banners; initSlider(); //写缓存 ACache aCache = ACache.get(getContext()); aCache.put(Contants.API.SLIDE_LAYOUT_URL, (ArrayList<Banner>)banners); } @Override public void onError(Response response, int code, Exception e) { } @Override public void onFailure(Request request, Exception e) { super.onFailure(request, e); //读缓存 ACache aCache = ACache.get(getContext()); //使用getAsObject(),直接进行强转 mBanner = (ArrayList<Banner>) aCache.getAsObject(Contants.API.SLIDE_LAYOUT_URL); initSlider(); } });
看这样写怎么样,不仅代码少了很多,而且顺带加载的过程还有SpotsDialog的效果。以上界面的刷新如initSlider()都不需要handler
因为已经是UI线程。
怎么封装的呢?下面就请看代码吧!BaseCallbackpackage renyou.com.renyoushop.http; import android.os.Handler; import android.os.Looper; import android.util.Log; import com.google.gson.Gson; import com.google.gson.JsonParseException; import com.squareup.okhttp.Callback; import com.squareup.okhttp.FormEncodingBuilder; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; public class OkHttpHelper { public static final String TAG="OkHttpHelper"; private static OkHttpHelper mInstance;//单例模式 private OkHttpClient mHttpClient; private Gson mGson; private Handler mHandler; static { mInstance = new OkHttpHelper(); } private OkHttpHelper(){ mHttpClient = new OkHttpClient(); //设置几个超时时间 mHttpClient.setConnectTimeout(10, TimeUnit.SECONDS); mHttpClient.setReadTimeout(10,TimeUnit.SECONDS); mHttpClient.setWriteTimeout(30,TimeUnit.SECONDS); mGson = new Gson(); mHandler = new Handler(Looper.getMainLooper()); }; /** * * @return 唯一的OkHttpHelper对象 */ public static OkHttpHelper getInstance(){ return mInstance; } /** * * @param url 请求的url地址 * @param callback 自定义的callback */ public void get(String url,BaseCallback callback){ Request request = buildGetRequest(url); request(request,callback); } /** * * @param url 请求的url地址 * @param param 封装的参数 * @param callback 自定义的callback */ public void post(String url,Map<String,String> param, BaseCallback callback){ Request request = buildPostRequest(url,param); request(request,callback); } /** * 请求网络 * @param request * @param 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) { callback.onFailure(request,e); } @Override public void onResponse(Response response) throws IOException { callback.onResponse(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 (JsonParseException e){ // Json解析的错误 callback.onError(response,response.code(),e); } } } else { callbackError(callback,response,null); } } }); } 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); } }); } 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(); } 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(); } enum HttpMethodType{ GET, POST, } }
有dialog的callbackpackage renyou.com.renyoushop.http; import com.google.gson.internal.$Gson$Types; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; 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) ; }
gradle:package renyou.com.renyoushop.http; import android.content.Context; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import dmax.dialog.SpotsDialog; 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(); } }
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.github.d-max:spots-dialog:0.4@aar'
喜欢就给个赞吧!