简单的封装okhttp
来源:互联网 发布:广东开放大学网络 编辑:程序博客网 时间:2024/05/16 15:53
由于公司的项目需要上传文件,利用阿里的oss存储,整个过程比较麻烦。对于网络访问就简单的用okhttp封装了一些需要的方法,比较简单。
主要从ok的两点入手,一是ok获取网络结果是在子线程,无法直接更新比较麻烦,另外就是参数将结果解析。
直接上代码
创建httpmanager类,官方文档都说了最好使用单例,所以我们也就不对着干了。
官网地址:http://square.github.io/okhttp/
此处需要注意在2.x版本时,时间时间等设置与3.x版本不一样,如果还像2.x版本设置是没有效果的差异如下:
//创建OkHttpClient的实例// okHttpClient = new OkHttpClient(); 2.0版本构建类的模式okHttpClient = new OkHttpClient.Builder()//3.x版本构建类的模式 .readTimeout(30, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS) /* .readTimeout(1, TimeUnit.MINUTES) .connectTimeout(1, TimeUnit.MINUTES)*/ .build();//3.0后最新编辑模式
整体上就不说了直接贴上代码:
public class HttpManager { private static HttpManager mHttpManager;// private final OkHttpClient okHttpClient; private final Gson gson; private final Handler handler; private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");//post请求编码 private final OkHttpClient okHttpClient; private String mNppcodes="abcd"; public HttpManager() { //创建OkHttpClient的实例// okHttpClient = new OkHttpClient(); 2.0版本构建类的模式 okHttpClient = new OkHttpClient.Builder()//3.x版本构建类的模式 .readTimeout(30, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS) /* .readTimeout(1, TimeUnit.MINUTES) .connectTimeout(1, TimeUnit.MINUTES)*/ .build();//3.0后最新编辑模式 //解析JSON gson = new Gson(); //子线程中更新Ui用到Handler handler = new Handler(Looper.getMainLooper()); } //单例 public static HttpManager getHttpManager() { if (mHttpManager == null) { synchronized (HttpManager.class) { if (mHttpManager == null) { mHttpManager=new HttpManager(); } } } return mHttpManager; } /** * get请求 * @param url * @param baseCallBack */ public void get(String url,BaseCallBack baseCallBack,String token){ Request request=buildRequest(url, RequestTyep.GET,token); doRequest(request,baseCallBack); } /** * post请求 * @param url * @param baseCallBack */ public void postJson(String url,Object json ,String token,BaseCallBack baseCallBack){ Gson gson = new Gson(); String gsonString = gson.toJson(json); Request.Builder build=new Request.Builder(); build .post(buildRequestJsonBody(gsonString)) .url(url) .addHeader("C_AT_",token) .addHeader("nppCode",mNppcodes); Request request = build.build(); doRequest(request,baseCallBack); }/** 并且返回时间差* */ public void postJsonAndGet(String url, Object json , String token, BaseCallBack baseCallBack, Context context){ Gson gson = new Gson(); String gsonString = gson.toJson(json); Request.Builder build=new Request.Builder(); build .post(buildRequestJsonBody(gsonString)) .url(url) .addHeader("C_AT_",token) .addHeader("nppCode",mNppcodes); Request request = build.build(); doRequestForgettime(request,baseCallBack,context); } /*同步post请求 * */ public String executepostJson(String url,String json ,String token) { Request.Builder build=new Request.Builder(); build.post(buildRequestJsonBody(json)) .url(url) .addHeader("C_AT_",token) .addHeader("nppCode",mNppcodes); Request request = build.build(); return doExecuteRequest(request); }/** * postJson的body */ private RequestBody buildRequestJsonBody(String json) { RequestBody body = RequestBody.create(JSON,json); return body; } /** * 创建Request//请求头也可以分装在此 * @return */ private Request buildRequest(String url, RequestTyep type, String token) { Request.Builder build=new Request.Builder(); if (type== RequestTyep.GET){ build.get(); }else if (type== RequestTyep.POST){ build.post(buildRequestBody()); } build.url(url) .addHeader("C_AT_",token); return build.build(); } /** * 创建post请求体 * @return */ private RequestBody buildRequestBody() { FormBody.Builder builder=new FormBody.Builder(); return builder.build(); } /** * 请求类型 */ enum RequestTyep{ GET, POST, POSTJSON } private String doExecuteRequest(Request request) { Response response = null; try { response = okHttpClient.newCall(request).execute(); if (response.isSuccessful()) { String string = response.body().string(); return string; } else { LogUtils.wyjlog("false"); return ""; } } catch (IOException e) { e.printStackTrace(); return ""; } } /** * okHttp post同步请求 */ private String executePost (String url,String json) { try { Gson gson = new Gson(); String gsonString = gson.toJson(json); Request.Builder build=new Request.Builder(); build .post(buildRequestJsonBody(gsonString)) .url(url).addHeader("C_AT_",token) .addHeader("nppCode",mNppcodes); Request request = build.build(); final Call call = okHttpClient.newCall(request);//创建一个Call Response response = call.execute(); //执行请求 if (response.isSuccessful()) { //请求执行成功 LogUtils.wyjlog("response ----->" + response.body().string()); return response.body().string(); } else { return ""; } } catch (Exception e) { return ""; } } private void doRequest(Request request, final BaseCallBack baseCallBack){// okHttpClient.newCall().execute(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { senFailure(baseCallBack,call, e,"未连接上服务器"+e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { boolean successful = response.isSuccessful(); if (successful){ String json = response.body().string(); sendSuccess(baseCallBack,call,json); }else { int code=response.code(); ResponseBody body = response.body(); String string = body.string(); senFailure(baseCallBack,call,null,code+"----"+string); } } }); } private void doRequestForgettime(Request request, final BaseCallBack baseCallBack, final Context context){// okHttpClient.newCall().execute(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { senFailure(baseCallBack,call, e,"未连接上服务器"+e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { boolean successful = response.isSuccessful(); Headers headers = response.headers(); long clientTime = getDeltaBetweenServerAndClientTime(headers);//utc时间显示 LogUtils.wyjlog("clientTime"+clientTime); SpUtils.saveString(context, SpConstant.TIMEESCAPE,clientTime+""); if (successful){ String json = response.body().string(); sendSuccess(baseCallBack,call,json); }else { int code=response.code(); ResponseBody body = response.body(); String string = body.string(); senFailure(baseCallBack,call,null,code+"----"+string); } } }); } /** * 获取差值 **/ private long getDeltaBetweenServerAndClientTime(Headers headers) { long deltaBetweenServerAndClientTime=0; if (headers!=null) { final String strServerDate = headers.get("Date"); if (!TextUtils.isEmpty(strServerDate)){// final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.CHINA); final SimpleDateFormat simpleDateFormat =new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.ENGLISH); TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); try { Date serverDate = simpleDateFormat.parse(strServerDate); deltaBetweenServerAndClientTime = serverDate.getTime()-new Date().getTime()+8*60*60*1000; } catch (ParseException e) { e.printStackTrace(); } } } return deltaBetweenServerAndClientTime; } /** * 请求成功的处理 * @param baseCallBack * @param call * @param json */ private void sendSuccess(final BaseCallBack baseCallBack, final Call call, final String json) { handler.post(new Runnable() { @Override public void run() { if (baseCallBack.type==String.class){ try { baseCallBack.onSuccess(call,json); } catch (Exception e) { e.printStackTrace(); } }else { Object object = gson.fromJson(json, baseCallBack.type); try { baseCallBack.onSuccess(call,object); } catch (Exception e) { e.printStackTrace(); } } } }); } /** * 请求失败的处理 * @param baseCallBack * @param call * */ private void senFailure(final BaseCallBack baseCallBack, final Call call, final IOException e, final String code) { handler.post(new Runnable() { @Override public void run() { baseCallBack.onFailure(call,e); LogUtils.wyjlog("网络请求状态:"+code); } }); }}
然后根据更新的需求:在主线程中更新,创建了一个BaseCallBack抽象类:
/** * @创建者 wyj * @创建时间 2017/4/514:09. * @描述 回调 * @更新者 ${author} * @更新时间 2017/4/514:09. */public abstract class BaseCallBack<T> { Type type; 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() { type = getSuperclassTypeParameter(getClass()); } public abstract void onFailure(Call call, IOException e); public abstract void onSuccess(Call call, T t) throws Exception;}
还有些其他的用法可参看文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
阅读全文
0 0
- okhttp的简单封装
- OkHttp的简单封装
- okhttp的简单封装
- 简单的封装okhttp
- OKHTTP的简单封装
- okhttp的简单封装
- 简单的okhttp封装
- 简单的封装Okhttp
- 简单的封装okhttp
- okhttp简单的二次封装
- OKHttp的简单封装类
- 基于okhttp的简单封装
- okHttp的简单封装使用
- Okhttp 简单的网络封装
- Okhttp的简单二次封装
- Okhttp简单的二次封装
- 对okhttp的简单封装
- okhttp的使用以及简单的封装
- 2017-10-30方法参数传递
- 前端之js-插件篇
- 数字图像中的傅里叶变换(DFT&FFT)
- 情书————字符串
- linux基础学习11
- 简单的封装okhttp
- Go语言常量
- 阻止浏览器复制方法
- 【Java开发-linux工具】SecureCRT配置
- Eigen的简单用法
- 文本数据处理—结合mysql模拟实现消息队列
- JZOJ 5436. 【NOIP2017提高A组集训10.30】Group
- 每日练习10.31
- Toolbar的使用