android架构系列-封装自己的okhttp

上传人:第*** 文档编号:31320760 上传时间:2018-02-06 格式:DOCX 页数:8 大小:62.59KB
返回 下载 相关 举报
android架构系列-封装自己的okhttp_第1页
第1页 / 共8页
android架构系列-封装自己的okhttp_第2页
第2页 / 共8页
android架构系列-封装自己的okhttp_第3页
第3页 / 共8页
android架构系列-封装自己的okhttp_第4页
第4页 / 共8页
android架构系列-封装自己的okhttp_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《android架构系列-封装自己的okhttp》由会员分享,可在线阅读,更多相关《android架构系列-封装自己的okhttp(8页珍藏版)》请在金锄头文库上搜索。

1、Android 架构系列-封装自己的 okhttp1 网络库的选择和为什么放弃 retrofit本来项目的网络库选择的搭配是最流行的 retrofit+okhttp+gson.如下图版本库里还有记录。版本记录But!后来遇到了这样的问题:服务端提供的 API 无法遵循 Restful 的 API 格式,而且不同模块由于分服务开发的,也不能保证格式一致。导致 API 接口层的实现十分牵强。最终 api 层的编写不能专注于业务,适得其反。(最起码现在的服务端还不适合与 retrofit 的使用)最后决定放弃使用 retrofit,使用自己二次封装的 okhttp。2 封装使用 okhttp封装过程

2、中参考了:hongyang 的 Android OkHttp 完全解析 是时候来了解 OkHttp 了赵凯强的 开源项目 OkHttpPlus2.1 怎么使用先说封装好的 okhttp+gson 如何使用。(封装了 POST 请求,GET 请求,上传文件,下载文件,取消请求和 Gson 转换等功能)2.1.1 POST 请求Map params = new HashMap();params.put(name, tsy);MyOkHttp.get().post(this, http:/192.168.3.1/test_okhttp.php, params, new JsonResponseHan

3、dler() Overridepublic void onSuccess(int statusCode, JSONObject response) LogUtils.v(TAG, statusCode + + response);Overridepublic void onFailure(int statusCode, String error_msg) LogUtils.v(TAG, statusCode + + error_msg););2.1.2 GET 请求Map params = new HashMap();params.put(name, tsy);MyOkHttp.get().g

4、et(this, http:/192.168.3.1/test_okhttp.php, params, new RawResponseHandler() Overridepublic void onSuccess(int statusCode, String response) LogUtils.v(TAG, statusCode + + response);Overridepublic void onFailure(int statusCode, String error_msg) LogUtils.v(TAG, statusCode + + error_msg););2.1.3 上传文件M

5、ap params = new HashMap();params.put(name, tsy);Map files = new HashMap();File file = new File(Environment.getExternalStorageDirectory() + /com.ci123.service.splashandroid/splash/1.png);files.put(avatar, file);MyOkHttp.get().upload(this, http:/192.168.3.1/test_post.php, params, files, new GsonRespon

6、seHandler() Overridepublic void onFailure(int statusCode, String error_msg) LogUtils.v(TAG, statusCode + + error_msg);Overridepublic void onSuccess(int statusCode, BB response) LogUtils.v(TAG, statusCode + + response.ret);Overridepublic void onProgress(long currentBytes, long totalBytes) LogUtils.v(

7、TAG, currentBytes + / + totalBytes););2.1.4 下载文件MyOkHttp.get().download(this, http:/192.168.3.1/output_tmp.jpg,Environment.getExternalStorageDirectory() + /com.tsy.splashandroid/, 1.jpg,new DownloadResponseHandler() Overridepublic void onFinish(File download_file) LogUtils.v(TAG, onFinish: + downloa

8、d_file.getPath();Overridepublic void onProgress(long currentBytes, long totalBytes) LogUtils.v(TAG, currentBytes + / + totalBytes);Overridepublic void onFailure(String error_msg) LogUtils.v(TAG, error_msg););2.1.5 取消请求(建议放在 BaseActivity,BaseFragment 的 onDestroy 中)MyOkHttp.get().cancel(this);2.1.6 返回

9、格式post,get,upload3 个接口可以选择返回格式为普通 Json 还是 Gson1.普通 json回调继承 JsonResponseHandler,例如 POST 请求的例子2.3.gson回调继承 GsonResponseHandler,并设置泛型 T,例如 Upload 请求的例子4.5.raw 原始数据回调继承 RawResponseHandler,例如 GET 请求例子6.2.2 源码解析源码集成在了 BaseAndroidProject 中作为网络底层模块,以 module 方式封装。其他项目可以直接 module 拿过来引入项目即可使用。BaseAndroidProje

10、ct 的 Github 地址:https:/ API 入口在 MyOkhttp 文件中。POST 请求和 GET 请求的实现很简单。在这我主要说明如何封装 gson response 和上传下载的进度监听。2.2.1 gson 返回封装gson 最后封装成了如下的使用形式:MyOkHttp.get().post(this, http:/192.168.3.1/test_okhttp.php, params, new GsonResponseHandler() Overridepublic void onFailure(int statusCode, String error_msg) LogU

11、tils.v(TAG, statusCode + + error_msg);Overridepublic void onSuccess(int statusCode, BB response) LogUtils.v(TAG, statusCode + + response.ret););gson response 与普通 json 返回不同的是,在 GsonResponseHandler 的构造函数中使用反射机制动态获取到了本身的泛型类型,然后将该泛型类型转化为了Gson 可以使用的 Type 保存起来。这样在结果回调时就可以使用该 Type 转为Gson。public abstract cl

12、ass GsonResponseHandler implements IResponseHandler Type mType;public GsonResponseHandler() Type myclass = getClass().getGenericSuperclass(); /反射获取带泛型的 classif (myclass instanceof Class) throw new RuntimeException(Missing type parameter.);ParameterizedType parameter = (ParameterizedType) myclass; /获

13、取所有泛型mType = $Gson$Types.canonicalize(parameter.getActualTypeArguments()0); /将泛型转为 typepublic final Type getType() return mType;public abstract void onSuccess(int statusCode, T response);Overridepublic void onProgress(long currentBytes, long totalBytes) 然后在 okhttp 获得到 response 后,判断到 responseHandler

14、是 gson,就将结果转为 gson 格式。if(mResponseHandler instanceof JsonResponseHandler) . else if(mResponseHandler instanceof GsonResponseHandler) mHandler.post(new Runnable() Overridepublic void run() try Gson gson = new Gson();(GsonResponseHandler)mResponseHandler).onSuccess(response.code(),gson.fromJson(respon

15、se_body, (GsonResponseHandler)mResponseHandler).getType(); catch (Exception e) LogUtils.e(onResponse fail parse gson, body= + response_body, e);mResponseHandler.onFailure(response.code(), fail parse gson, body= + response_body); );2.2.2 上传和下载的监听进度该部分参考了赵凯强的-开源项目 OkHttpPlus 里面说明的比较清楚。大概的原理就是使用 okio 分别重写 requestbody 和 responsebody,在 body 中设置进度监听返回。just so so。详细原理可以直接跳转博客进行学习啊,在这就不重新造轮子了。3 结尾最终,okhttp 被我封装为了一个 module,在这个 module 中就会引入 gson 和okhttp 了,所以不把它导出为 jar 包。以后的网络底层库就用这个 module 啦!目录结构

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号