版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、Android 中网络请求的进化Android 开发中网络编程是必不可少的,不接入互联网的 APP 就没有言。废话不多说了,下面请看Android 中网络请求的进化图:可OkHttp 会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个 IP地址,当第一个IP 连接失败的时候,会自动尝试下一个IP。OkHttp 还处理了代理服务器问题和SSL 握手失败问题。(并发)使用 OkHttp 无需重写您程序中的网络代码。OkHttp 实现了几乎和 .HttpURLConnection 一样的 API。如果您用了 Apache HttpC nt,则 OkHttp 也提供了一个对应的okhttp
2、-apache 模块。从上面的简单介绍中可以知道,虽然在编程上面并不会简洁很多,但是OKHttp的一些功能能够帮助自动完成一些很复杂的操作,笔者个人认为最大的卖点就是用户的流量。三、OKHttp 的基本使用1、在Gradle中引入CardView的依赖库。2、OKHttp 在使用之前,首先要了解下面几个比较的类以及它的功能。OkHttpCnt 客户端对象Request 是OkHttp 中的请求,t 请求中需要包含RequestBodyBuilder 是辅助类,用于生产对象Response 即OkHttp 中的响应,响应中可以得到返回是否成功,返回数据MediaType数据类型,用来表明是 JS
3、ON 等一系列格式RequestBody 请求数据,在t 请求中用到cnt.newCall(request).execute()是同步的请求方法compile com.squareup.okhttp:okhttp:2.7.2一般的get 请求一般的t 请求基于Http 的文件上传文件加载支持请求回调,直接返回对象、对象集合支持 ses的保持 3、OKHttp 的基本使用步骤(以T 方式从服务器取 JSON 数据为例)创建 OkHttpCnt 对象,文档要求最好使用单例模式,在后文对OKHttp 进行封装的时候会提到。如果是t 请求的话,需要通过 FormEncodingBuilder 创建 R
4、equestBody对象,指定需要t 传进去的参数。get 请求则不用。创建 Request 对象,这个对象是请求对象,需要指定 URL。t 请求的时候需要指定RequestBody 对象,get 请求则不用。调用 OkHttpCnt 的 newCall 方法,把 Request 对象传进去,然后执行 execute 或者 enqueue 方法,两者的区别在上文已提到。在 CallBack 中的 onResponse 方法就可以做你需要做的事。onResponse 回调的参数是 response,一般情况下,比如希望获得返回的字符串,可以通过 response.body().string()获
5、取;如果希望获得返回的二进制字节数组,则调用 response.body().bytes();如果你想拿到返回的 inputStream,则调用 response.body().byteStream()看到这,你可能会奇怪,竟然还能拿到返回的 inputStream,看到这个最起码能一点,这里支持大文件,有inputStream就可以通过IO 的方式写文件。不过也说明一个问题,这个 onResponse 执行的线程并不是 UI 线程。的确是的,如果你希望操作控件,还是需要使用handler 等。cnt.newCall(request).enqueue(Callback callBack)是异步
6、的请求方法,但是Callback 里面的代码是执行在子线程的,因此不能更新 UI。OkHttpCnt cnt = new OkHttpCnt();RequestBody body = new FormEncodingBuilder().add(type, 1).build();Request request = new Request.Builder().url(Constants.URL_BANNER).t(body).build();cnt.newCall(request).enqueue(new Callback() Overridepublic void onFailure(Reque
7、st request, IOException e) Overridepublic void onResponse(Response response) throws IOException if (response.icsful() android.os.Message msg = new Message(); msg.what = 1;msg.obj = response.body().string();mHandler.sendMessage(msg););这里只是一个简单t 请求,从服务器获取数据的介绍,至于get 请求只不过是去掉RequestBody 对象而已。至于如何向服务器提交
8、数据,可以在熟悉上面的基本用法之后查阅面这一篇文章,的WIKI(的介绍文档)。另外楠妹妹也。下四、OKHttp 的简单封装回顾上面的代码,试想一下如果每次请求都写这么多重复代码,这样会严重降低开发效率,因此需要对OKHttp 进行封装。对代码进行封装是最为面向对象程序员的基本素养,减少重复代码,降低难度以及成本。上也有对OKHttp 进行过封装,叫做OKHttpUtils。不过这里自己动手,一起来学下如何进行封装。具体的有下面几点:1、首先,OKHttp要求最好用单例模式去使用OKHttpCnt 类的,因此自定义一个OKHttpHelper 类,并且使用单例模式。2、对get 以及t 方法进行
9、封装,主要的是把共同的代码抽取出来,例如代码中被抽取出来的request 方法。3、对外公开一些静态方法,包括get 和t 方法等。4、Callback 基类,对OKHttp 的回调进行封装。这个类用里面有一个 type,是方便回调中使用Gson 对JSON 进行的封装。使用Callback 的时候只需要在泛型中传入类似Data 、List即可以方便地使用JSON。5、由于原来的回调不在主线程,因此程。需要使用Handler 来将回调放入主线其余的可以参照代码,有详细注释。importimportandroid.os.Handler;android.os.Looper;import impor
10、t import import import import .gson.Gson;.gson.JsonParseException;com.squareup.okhttp.Callback; com.squareup.okhttp.FormEncodingBuilder; com.squareup.okhttp.OkHttpCnt; com.squareup.okhttp.Request; com.squareup.okhttp.RequestBody;com.squareup.okhttp.Response;import importimportjava.io.IOException; ja
11、va.util.Map;java.util.concurrent.TimeUnit;/* 这个类用来辅助 OKHttp*/public class OkHttpHelper /* 采用单例模式使用 OkHttpC*/ntprivate privateprivatessic OkHttpHelper mOkHttpHelperInstance;ic OkHttpCnt mCntInstance;Handler mHandler;private Gson mGson;/* 单例模式,私有构造函数,构造函数里面进行一些初始化*/privatemCOkHttpHelper() ntInstance=
12、new OkHttpCnt();mCmC mCntInstanntInstan ntInstanetConnectTimeout(10, TimeUnit.SECONDS);etReadTimeout(10, TimeUnit.SECONDS); etWriteTimeout(30, TimeUnit.SECONDS);mGson = new Gson();mHandler = new Handler(Looper.getMainLooper();/*获取实例*return*/ public sic OkHttpHelper getinstance() if (mOkHttpHelperIns
13、tance = null) synchronized (OkHttpHelper.class) if (mOkHttpHelperInstance = null) mOkHttpHelperInstance = new OkHttpHelper();return mOkHttpHelperInstance;/* 封装一个 request 方法,不管*/t 或者 get 方法中都会用到public void request(final Request request, final BaseCallbackcallback) /在请求之前所做的事,比如弹出框等callback.onRequestB
14、efore();mCntInstance.newCall(request).enqueue(new Callback() Overridepublic void onFailure(Request request, IOException e) /返回失败callbackFailure(request, callback, e);Overridepublic void onResponse(Response response) throws IOExceptionif (response.icsful() /返回成功回调String resString = response.body().st
15、ring();if (callback.mType = String.class) /如果需要返回String 类型callbackSuc else s(response, resString, callback);/如果返回的是其他类型,则利用 Gson 去try Object o = mGson.fromJson(resString,callback.mType);callbackSucs(response, o, callback); catch (JsonParseException e) e.prStackTrace();callbackError(response, callbac
16、k, e); else /返回错误callbackError(response, callback, null););/* 在主线*执行的回调*/paramparam paramresponseresString callbackprivate void callbackSucs(final Response response, finalObjecto, final BaseCallback callback) mHandlost(new Runnable() Overridepublic void run() callback.onSucs(response, o););/* 在主线执行的
17、回调 response callbacke*/paramparam paramprivate void callbackError(final Response response, finalBaseCallback callback, final Exception e) mHandlost(new Runnable() Overridepublic void run() callback.onError(response, response.code(), e););/* 在主线执行的回调 request callbacke*/param paramparamprivate void ca
18、llbackFailure(final Request request, finalBaseCallback callback, final Exception e) mHandlost(new Runnable() Overridepublic void run() callback.onFailure(request, e););/* 对外公开的 get 方法*param urlparam callback*/public void get(String url, BaseCallback callback) Request request = buildRequest(url, null
19、, HttpMethodType.GET); request(request, callback);/* 对外公开的t 方法*/parampar paramurlarams callbackpublic voidcallback) t(String url, Map params, BaseCallbackRequest request = buildRequest(url, params, HttpMethodType.request(request, callback);T);/* 构建请求对象*/param par paramreturnurlarams typeprivate Requ
20、est buildRequest(String url, Map params, HttpMethodType type) Request.Builder builder = new Request.Builder(); builder.url(url);if (type = HttpMethodType.GET) builder.get(); else if (type = HttpMethodType.T) buildost(buildRequestBody(params);return builder.build();/* 通过 Map 的键值对构建请求对象的 body*pararams
21、return*/private RequestBody buildRequestBody(Map params) FormEncodingBuilder builder = new FormEncodingBuilder();if (params != null) for (Mntry entity : params.entrySet()builder.add(entity.getKey(),entity.getValue();return builder.build();/* 这个枚举用于指明是哪一种提交方式*/enum HttpMethodType GET,Tpackageshop.htt
22、p;import importimportcom.gson.ernal.$Gson$Types;com.squareup.okhttp.Request;com.squareup.okhttp.Response;importimportjava.lang.reflect.ParameterizedType;java.lang.reflect.Type;/* 基本的回调*/public abstract class BaseCallback /* type 用于方便 JSON 的*/public Type mType;/*把 type 转换成对应的类,这里不用看明白也行。*param subcla
23、ssreturn*/sic 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(paramet
24、erized.getActualTypeArguments()0);/* 构造的时候获得 type 的 class*/public BaseCallback() mType = getSuperclassTypeParameter(getClass();/* 请求之前调用*/public abstract void onRequestBefore();/*请求失败调用(网络问题)*param requestparam e*/public abstract void onFailure(Request request, Exceptione);/*请求成功而且没有错误的时候调用*param response* param t*/publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 印刷包装销售心得交流
- 通讯器材行业销售工作总结
- 公共空间设计师的工作内容
- 医院保安工作总结
- 体育用品行业销售技巧总结
- 消防安全数据分析与应用培训
- 现代商务谈判课程设计
- 我爱我家演讲稿汇编七篇
- 护士支援核酸采集心得(10篇)
- 机械cadcam课程设计泵
- 项目主要技术方案计划表
- 【真题】北京市西城区六年级语文第一学期期末试卷 2021-2022学年(有答案)
- 压铸件气孔通用标准
- 安捷伦气质联用仪(Agilent-GCMS)培训教材
- 2022年FURUNO电子海图完整题库
- 奔驰卡车产品分析(课堂PPT)
- 加固工程竣工验收资料(质量验收表全套)
- 卫生技术人员执业监管记录
- 反循环钻孔灌注桩施工方案
- 齿轮传动的设计论文
- 国家开放大学《纳税筹划》章节测试参考答案
评论
0/150
提交评论