Android架构系列-封装自己的okhttp.docx_第1页
Android架构系列-封装自己的okhttp.docx_第2页
Android架构系列-封装自己的okhttp.docx_第3页
Android架构系列-封装自己的okhttp.docx_第4页
Android架构系列-封装自己的okhttp.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android架构系列-封装自己的okhttp1 网络库的选择和为什么放弃retrofit本来项目的网络库选择的搭配是最流行的retrofit+okhttp+gson.如下图版本库里还有记录。版本记录But!后来遇到了这样的问题:服务端提供的API无法遵循Restful的API格式,而且不同模块由于分服务开发的,也不能保证格式一致。导致 API接口层的实现十分牵强。最终api层的编写不能专注于业务,适得其反。(最起码现在的服务端还不适合与retrofit的使用)最后决定放弃使用retrofit,使用自己二次封装的okhttp。2 封装使用okhttp封装过程中参考了: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, /test_okhttp.php, params, new JsonResponseHandler() Override public void onSuccess(int statusCode, JSONObject response) LogUtils.v(TAG, statusCode + + response); Override public 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().get(this, /test_okhttp.php, params, new RawResponseHandler() Override public void onSuccess(int statusCode, String response) LogUtils.v(TAG, statusCode + + response); Override public void onFailure(int statusCode, String error_msg) LogUtils.v(TAG, statusCode + + error_msg); );2.1.3 上传文件Map 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, /test_post.php, params, files, new GsonResponseHandler() Override public void onFailure(int statusCode, String error_msg) LogUtils.v(TAG, statusCode + + error_msg); Override public void onSuccess(int statusCode, BB response) LogUtils.v(TAG, statusCode + + response.ret); Override public void onProgress(long currentBytes, long totalBytes) LogUtils.v(TAG, currentBytes + / + totalBytes); );2.1.4 下载文件MyOkHttp.get().download(this, /output_tmp.jpg, Environment.getExternalStorageDirectory() + /com.tsy.splashandroid/, 1.jpg, new DownloadResponseHandler() Override public void onFinish(File download_file) LogUtils.v(TAG, onFinish: + download_file.getPath(); Override public void onProgress(long currentBytes, long totalBytes) LogUtils.v(TAG, currentBytes + / + totalBytes); Override public void onFailure(String error_msg) LogUtils.v(TAG, error_msg); );2.1.5 取消请求(建议放在BaseActivity,BaseFragment的onDestroy中)MyOkHttp.get().cancel(this);2.1.6 返回格式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拿过来引入项目即可使用。BaseAndroidProject的Github地址:/tsy12321/BaseAndroidProject源码API入口在MyOkhttp文件中。POST请求和GET请求的实现很简单。在这我主要说明如何封装gson response和上传下载的进度监听。2.2.1 gson返回封装gson最后封装成了如下的使用形式:MyOkHttp.get().post(this, /test_okhttp.php, params, new GsonResponseHandler() Override public void onFailure(int statusCode, String error_msg) LogUtils.v(TAG, statusCode + + error_msg); Override public void onSuccess(int statusCode, BB response) LogUtils.v(TAG, statusCode + + response.ret); );gson response与普通json返回不同的是,在GsonResponseHandler的构造函数中使用反射机制动态获取到了本身的泛型类型,然后将该泛型类型转化为了Gson可以使用的Type保存起来。这样在结果回调时就可以使用该Type转为Gson。public abstract class GsonResponseHandler implements IResponseHandler Type mType; public GsonResponseHandler() Type myclass = getClass().getGenericSuperclass(); /反射获取带泛型的class if (myclass instanceof Class) throw new RuntimeException(Missing type parameter.); ParameterizedType parameter = (ParameterizedType) myclass; /获取所有泛型 mType = $Gson$Types.canonicalize(parameter.getActualTypeArguments()0); /将泛型转为type public final Type getType() return mType; public abstract void onSuccess(int statusCode, T response); Override public void onProgress(long currentBytes, long totalBytes) 然后在okhttp获得到response后,判断到responseHandler是gson,就将结果转为gson格式。if(mResponseHandler instanceof JsonResponseHandler) . else if(mResponseHandler instanceof GsonResponseHandler) mHandler.post(new Runnable() Override public void run() try Gson gson = new Gson(); (GsonResponseHandler)mResponseHandler).onSuccess(response.code(), gson.fromJson(response_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 上传和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论