27117516437如果你能读到这封信信到哪了

转载出处:&;&本文出自:
之前写了篇,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工具类中的方法也是剧增,各种重载方法,以致于使用起来极不方便,实在惭愧。
于是,在这个周末,抽点时间对该工具类,进行了重新的拆解与编写,顺便完善下功能,尽可能的提升其使用起来的方便性和易扩展性。
标题的改善,也是指的是对于我之前的代码进行改善。
如果你对okhttp不了解,可以通过进行了解。
ok,那么目前,该封装库志支持:
一般的get请求
一般的post请求
基于Http的文件上传
上传下载的进度回调
支持请求回调,直接返回对象、对象集合
支持session的保持
支持自签名网站https的访问,提供方法设置下证书就行
支持取消某个请求
源码地址:
使用前,对于Android Studio的用户,可以选择添加:
compile project(':okhttputils')
compile 'com.zhy:okhttputils:2.0.0'
二、基本用法
目前基本的用法格式为:
OkHttpUtils
.addParams("username", "hyman")
.addParams("password", "123")
.execute(callback);
通过链式去根据自己的需要添加各种参数,最后调用execute(callback)进行执行,传入callback则代表是异步。如果单纯的execute()则代表同步的方法调用。
可以看到,取消了之前一堆的get重载方法,参数也可以进行灵活的选择了。
下面简单看一下,全部的用法:
(1)GET请求
String url = "http://www.csdn.net/";
OkHttpUtils
.addParams("username", "hyman")
.addParams("password", "123")
.execute(new StringCallback()
public void onError(Request request, Exception e)
public void onResponse(String response)
(2)POST请求
OkHttpUtils
.addParams("username", "hyman")
.addParams("password", "123")
.execute(callback);
(3)Post String
OkHttpUtils
.postString()
.content(new Gson().toJson(new User("zhy", "123")))
.execute(new MyStringCallback());
将string作为请求体传入到服务端,例如json字符串。
(4)Post File
OkHttpUtils
.postFile()
.file(file)
.execute(new MyStringCallback());
将file作为请求体传入到服务端.
(5)基于POST的文件上传(类似web上的表单)
OkHttpUtils.post()//
.addFile("mFile", "messenger_01.png", file)//
.addFile("mFile", "test1.txt", file2)//
.params(params)//
.headers(headers)//
.build()//
.execute(new MyStringCallback());
(6)下载文件
OkHttpUtils//
.url(url)//
.build()//
.execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")//
public void inProgress(float progress)
mProgressBar.setProgress((int) (100 * progress));
public void onError(Request request, Exception e)
Log.e(TAG, "onError :" + e.getMessage());
public void onResponse(File file)
Log.e(TAG, "onResponse :" + file.getAbsolutePath());
(7)显示图片
OkHttpUtils
.url(url)//
.build()//
.execute(new BitmapCallback()
public void onError(Request request, Exception e)
mTv.setText("onError:" + e.getMessage());
public void onResponse(Bitmap bitmap)
mImageView.setImageBitmap(bitmap);
哈,目前来看,清晰多了。
三、对于上传下载的回调
new Callback&?&()
public void inProgress(float progress)
//use progress: 0 ~ 1
对于传入的callback有个inProgress方法,需要拿到进度直接复写该方法即可。
四、对于自动解析为实体类
目前去除了Gson的依赖,提供了自定义Callback的方式,让用户自己去解析返回的数据,目前提供了StringCallback,FileCallback,BitmapCallback&分别用于返回string,文件下载,加载图片。
当然如果你希望解析为对象,你可以:
public abstract class UserCallback extends Callback&User&
//非UI线程,支持任何耗时操作
public User parseNetworkResponse(Response response) throws IOException
String string = response.body().string();
User user = new Gson().fromJson(string, User.class);
自己使用自己喜欢的Json解析库完成即可。
解析成List&User&,则如下:
public abstract class ListUserCallback extends Callback&List&User&&
public List&User& parseNetworkResponse(Response response) throws IOException
String string = response.body().string();
List&User& user = new Gson().fromJson(string, List.class);
五、对于https单向认证
非常简单,拿到xxx.cert的证书。
OkHttpUtils.getInstance()
.setCertificates(inputstream);
建议使用方式,例如我的证书放在assets目录:
* Created by zhy on 15/8/25.
public class MyApplication extends Application
public void onCreate()
super.onCreate();
OkHttpUtils
.getInstance()
.setCertificates(getAssets().open("aaa.cer"),
getAssets().open("server.cer"));
} catch (IOException e)
e.printStackTrace();
即可。别忘了注册Application。
注意:如果https网站为权威机构颁发的证书,不需要以上设置。自签名的证书才需要。
(1)全局配置
可以在Application中,通过:
OkHttpClient client =
OkHttpUtils.getInstance().getOkHttpClient();
然后调用client的各种set方法。
client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);
(2)为单个请求设置超时
比如涉及到文件的需要设置读写等待时间多一点。
OkHttpUtils
.url(url)//
.tag(this)//
.build()//
.connTimeOut(20000)
.readTimeOut(20000)
.writeTimeOut(20000)
.execute()
调用build()之后,可以随即设置各种timeOut.
(3)取消单个请求
RequestCall call = OkHttpUtils.get().url(url).build();
call.cancel()
目前对于支持的方法都添加了最后一个参数Object tag,取消则通过OkHttpUtils.cancelTag(tag)执行。
例如:在Activity中,当Activity销毁取消请求:
OkHttpUtils
.url(url)//
.tag(this)//
.build()//
protected void onDestroy()
super.onDestroy();
//可以取消同一个tag的
OkHttpUtils.cancelTag(this);//取消以Activity.this作为tag的请求
比如,当前Activity页面所有的请求以Activity对象作为tag,可以在onDestory里面统一取消。
七、浅谈封装
其实整个封装的过程比较简单,这里简单描述下,对于okhttp一个请求的流程大致是这样的:
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("/hongyangAndroid")
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
public void onFailure(Request request, IOException e)
public void onResponse(final Response response) throws IOException
//String htmlStr =
response.body().string();
其中主要的差异,其实就是request的构建过程。
我对Request抽象了一个类:OkHttpRequest
public abstract class OkHttpRequest
protected RequestBody requestB
protected R
protected S
protected S
protected Map&String, String&
protected Map&String, String&
protected OkHttpRequest(String url, String tag,
Map&String, String& params, Map&String, String& headers)
this.url =
this.tag =
this.params =
this.headers =
protected abstract Request buildRequest();
protected abstract RequestBody buildRequestBody();
protected void prepareInvoked(ResultCallback callback)
requestBody = buildRequestBody();
requestBody = wrapRequestBody(requestBody, callback);
request = buildRequest();
protected RequestBody wrapRequestBody(RequestBody requestBody, final ResultCallback callback)
return requestB
public void invokeAsyn(ResultCallback callback)
prepareInvoked(callback);
mOkHttpClientManager.execute(request, callback);
// other common methods
一个request的构建呢,我分三个步骤:buildRequestBody&,&wrapRequestBody&,buildRequest这样的次序,当以上三个方法没有问题时,我们就拿到了request,然后执行即可。
但是对于不同的请求,requestBody以及request的构建过程是不同的,所以大家可以看到buildRequestBody&,buildRequest为抽象的方法,也就是不同的请求类,比如OkHttpGetRequest、OkHttpPostRequest等需要自己去构建自己的request。
对于wrapRequestBody方法呢,可以看到它默认基本属于空实现,主要是因为并非所有的请求类都需要复写它,只有上传的时候呢,需要回调进度,需要对requestBody进行包装,所以这个方法类似于一个钩子。
其实这个过程有点类似模板方法模式,有兴趣可以看看一个短篇介绍&.
对于更加详细的用法,可以查看github上面的readme,以及demo,目前demo包含:
对于上传文件的两个按钮,需要自己搭建服务器,其他的按钮可以直接。
最后,由于本人水平有限,以及时间比较仓促~~发现问题,欢迎提issue,我会抽时间解决。 have a nice day ~
阅读(...) 评论()2287人阅读
玩转android(153)
管中窥豹(220)
一方面,最近关于OKHttp的讨论甚嚣尘上,另一方面,我最近也更新了android6.0,发现在6.0中HttpClient不能使用了,于是决定抽时间也看一下OKHttp,总结了一点东西,与大家分享。
以前读书的时候在学校用过GitHub上的一个开源控件AsyncHttpClient,当时解决了不少问题,上传图片以及download都能实现,感觉还不错,这次看完OKHttp,暂未发现两者在功能上的差异(如果哪位小伙伴发现了可以告诉我一下)。
对OKHttp的介绍还是比较详细,英文好的同学可以直接看官网的内容。使用OKHttp我们就需要,同时由于OKHttp依赖于Okio,我们也需要下载。这两个准备工作做好了就可以开始了。
一、发送Get请求
Request是OKHttp访问的请求,Callback是回调,有两种调用方式,一种是call.execute,这种方式不会开启新的线程,要在android中使用这个需要自己开启一个新线程,然后在线程中调用这个东西,这样反而麻烦了,所以个人推荐使用call.enqueue,call.enqueue会开启一个新的线程,在新线程中调用网络请求。这样的话我们就得通过Handler来与android UI交互了。
okHttpClient = new OkHttpClient();
request = new Request.Builder().url(HTTPURL).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
public void onResponse(Response response) throws IOException {
String res = response.body().string();
Message msg = new Message();
msg.what = REFRESHDATA;
mHandler.sendMessage(msg);
public void onFailure(Request arg0, IOException arg1) {
二、发送POST请求
发送POST请求,一种是提交JSON数据:
MediaType JSON = MediaType.parse("application/ charset=utf-8");
RequestBody body = RequestBody.create(JSON,
"{\"username\":\"lisi\",\"nickname\":\"李四\"}");
Request request = new Request.Builder().url(HTTPURL).post(body).build();
//后面的调用与GET相同
还有一种是提交键值对:
RequestBody formBody = new FormEncodingBuilder()
.add("username", "lisi").add("nickname", "李四").build()
Request request = new Request.Builder().url(HTTPURL).post(formBody)
其实OKHttp相对于HttpURLConnection已经简单了许多,但是我还是觉得麻烦,而且官方亦不建议我们创建多个OkHttpClient实例,于是又对它进行了一层简单的封装。
import java.io.IOE
import java.util.M
import java.util.S
import java.util.concurrent.TimeU
import com.squareup.okhttp.C
import com.squareup.okhttp.OkHttpC
import com.squareup.okhttp.R
import com.squareup.okhttp.R
* OKHttp封装工具类
* wangsong
public class OKHttpUtils {
private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient();
M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS);
* 不开启异步线程
* wangsong
* IOException
public static Response execute(Request request) throws IOException {
return M_OK_HTTP_CLIENT.newCall(request).execute();
* 开启异步线程访问,访问结果自行处理
* wangsong
* responseCallback
public static void enqueue(Request request, Callback responseCallback) {
M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback);
* 开启异步线程访问,不对访问结果进行处理
* wangsong
* responseCallback
public static void enqueue(Request request) {
M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {
public void onResponse(Response arg0) throws IOException {
public void onFailure(Request arg0, IOException arg1) {
* 为HttpGet请求拼接一个参数
* wangsong
public static String jointURL(String url, String name, String value) {
return url + "?" + name + "=" +
* 为HttpGet请求拼接多个参数
* wangsong
public static String jointURL(String url, Map&String, String& values) {
StringBuffer result = new StringBuffer();
result.append(url).append("?");
Set&String& keys = values.keySet();
for (String key : keys) {
result.append(key).append("=").append(values.get(key)).append("&");
return result.toString().substring(0, result.toString().length()-1);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:750126次
积分:10725
积分:10725
排名:第1226名
原创:256篇
评论:547条
欢迎一起讨论技术问题。
文章:11篇
阅读:30153
阅读:8214
阅读:31517
阅读:54993
文章:12篇
阅读:18319
阅读:13906
文章:20篇
阅读:17693
文章:53篇
阅读:131758&>&&>&&>&&>&OkHttpUtilsLib4Eclipse
OkHttpUtilsLib4Eclipse
上传大小:1.81MB
/hongyangAndroid/okhttp-utils的eclipse版本lib
综合评分:3(1位用户评分)
所需积分:0
下载次数:183
审核通过送C币
创建者:xiaoyaoyou1212
创建者:nigelyq
创建者:jin80506
课程推荐相关知识库
上传者其他资源上传者专辑
移动开发热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
OkHttpUtilsLib4Eclipse
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:OkHttpUtils一个专注于让网络请求更简单的框架
OkHttpUtils一个专注于让网络请求更简单的框架
1.支持的常用功能
一般的 get,post,put,delete,head,options请求基于Post的大文本数据上传,postString(),postJson()等多文件和多参数统一的表单上传(允许监听上传进度)支持一个key上传一个文件,也可以一个Key上传多个文件大文件下载和下载进度回调大文件上传和上传进度回调支持cookie的内存存储和持久化存储,支持传递自定义cookie提供网络缓存功能,默认支持304缓存协议,并额外扩展了三种本地缓存模式支持301、302重定向支持链式调用支持可信证书和自签名证书的https访问支持根据Tag取消网络请求支持自定义泛型Callback,自动根据泛型返回对象
2.支持的扩展功能
统一的文件下载管理(DownloadManager)
默认使用的是 get 请求,同时下载数量为3个,支持断点下载,断点信息使用ORMLite数据库框架保存,默认下载路径/storage/emulated/0/download,下载路径和下载数量都可以在代码中配置,下载管理使用了服务提高线程优先级,避免后台下载时被系统回收。
当你的项目需要做大量的下载的时候,并且多个页面需要监听下载进度,使用该扩展让你更方便。原生支持下载任务的开始、暂停、停止、出错、完成五个状态,当同时下载任务数量超过3个(可代码动态设置)时,后续任务自动等待,当有任务下载完成时,等待任务按照优先级自动开始下载。统一的文件上传管理(UploadManager)
默认使用的是 post 上传请求,该上传管理为简单管理,不支持断点续传和分片上传,只是简单的将所有上传任务使用线程池进行了统一管理,默认同时上传数量为1个。由于断点分片上传的技术需要大量的服务端代码配合,同时也会极大的增加客户端代码量,所以综合考虑,该框架不做实现。如果确实有特殊需要,可以自己做扩展。
项目的效果图如下:
请求详细信息
下载管理列表页
下载管理详情页
上传管理和图片选择
3.如何选择网络框架
说了这么多功能,我们来看看为什么要使用OkHttpUtils这个框架。
首先目前主流的几个网络框架
android-async-httpxUtilsvolleyretrofitokhttp
在此引用知乎上Stay Zhang的回答:
我们来先说一个常识性的错误:volley, retrofit, android-async-http 帮你封装了具体的请求,线程切换以及数据转换。而OkHttp 是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。
所以不要混淆。
-----以下纯个人主观见解
首先,我想即使你单纯使用OkHttp,还是会再包一层的,这样就等价于Volley之流的框架,只是封装的好与坏而已。
android-async-http内部实现是基于HttpClient, 想必你肯定知道6.0之后HttpClient是不是系统自带的了,不过它在最近的更新中将HttpClient的所有代码copy了一份进来,所以还能使用。
Volley是官方出的,volley在设计的时候是将具体的请求客户端做了下封装:HurlStack,也就是说可以支持HttpUrlConnection, HttpClient, OkHttp,相当于模版模式吧,这样解耦还是非常方便的,可以随意切换,如果你之前使用过Volley,并习惯使用,那直接写个OkHttp扩展就行了。
Retrofit因为也是square出的,所以大家可能对它更崇拜些。Retrofit的跟Volley是一个套路,但解耦的更彻底:比方说通过注解来配置请求参数,通过工厂来生成CallAdapter,Converter,你可以使用不同的请求适配器(CallAdapter), 比方说RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方说json, protobuff, xml, moshi等等。关键是想要用好这个框架,最好是和RxJava联用,否者和普通的网络框架也没什么区别,而对于RxJava,特别team人数多的情况下,总得有个完全精通的吧,万一掉坑里了呢。。。
4.OkHttpUtils的优势
优势一:性能高,专注于简单易用的网络请求,使用主流的okhttp进行封装,对于okhttp大家都知道,在Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了,并且支持HTTP2/SPDY黑科技,支持socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,拥有队列线程池,轻松写并发。优势二:特有的网络缓存模式,是大多数网络框架所不具备的,说一个应用场景,老板说我们的app不仅需要在有网的情况下展示最新的网络数据,还要在没网的情况下使用缓存数据,这时候是不是项目中出现了大量的代码判断当前网络状况,根据不同的状态保存不同的数据,然后决定是否使用缓存。细想一下,这是个通用的写法,于是OkHttpUtils提供了四种缓存模式,让你不用关心缓存的实现,而专注于数据的处理。(具体缓存的使用方法请看最后第四章节)。优势三:方便易用的扩展接口,可以添加全局的公共参数,全局拦截器,全局超时时间,更可以对单个请求定制拦截器,超时时间,请求参数修改等等,在使用上更是方便,原生支持的链式调用让你的请求更加清晰。优势四:强大的Cookie保持策略,我们知道在客户端对cookie的获取是个不太简单的事情,特别是还要处理cookie的过期时间,持久化策略等等,OkHttpUtils帮你彻底解决Cookie的难题,默认拥有内存存储和持久化存储两种实现,cookie全程自动管理,并且提供了额外的addCookie方式,允许介入到自动管理的过程中,添加你想创建的任何cookie。
所以就说这么多啦,选最适合项目的,选大多数人选择的,选简单易用的,就这么个标准,而OkHttpUtils正是在这种情况下诞生啦!!
5.使用方法
对于Android Studio的用户,可以选择添加:
compile 'com.lzy.net:okhttputils:1.6.0'
compile 'com.lzy.net:okhttpserver:0.1.7'
compile 'com.lzy.net:okhttputils:+'
compile 'com.lzy.net:okhttpserver:+'
对于Eclipse的用户,可以选择添加 /lib 目录下的jar包(可以点击下载):
为了方便大家使用,更加通俗的理解http的网络协议,建议做网络请求的时候,对每个请求抓包后查看请求信息和响应信息。如果是 Windows 操作系统,可以使用 Fiddler 对手机的请求进行抓包查看。如果是 Mac OS 操作系统,可以使用 Charles 对手机的请求进行抓包查看。具体的下载地址和抓包配置方法,我这就不提供了,请自行百度或谷歌。
6.使用注意事项
okhttputils使用的okhttp的版本是最新的 3.2.0 版本,和以前的 2.x 的版本可能会存在冲突。okhttpserver是对okhttputils的扩展,统一了下载管理和上传管理,对项目有需要做统一下载的可以考虑使用该扩展,不需要的可以直接使用okhttputils即可。对于缓存模式使用,需要与返回对象相关的所有javaBean必须实现Serializable接口,否者会报NotSerializableException。使用缓存时,如果不指定cacheKey,默认是用url带参数的全路径名为cacheKey。使用该网络框架时,必须要在 Application 中做初始化 OkHttpUtils.init(this);。
一、全局配置
一般在 Aplication,或者基类中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息,所有的请求参数都支持中文,
public void onCreate() {
super.onCreate();
HttpHeaders headers = new HttpHeaders();
headers.put(&commonHeaderKey1&, &commonHeaderValue1&);
headers.put(&commonHeaderKey2&, &commonHeaderValue2&);
HttpParams params = new HttpParams();
params.put(&commonParamsKey1&, &commonParamsValue1&);
params.put(&commonParamsKey2&, &这里支持中文参数&);
OkHttpUtils.init(this);
OkHttpUtils.getInstance()
.debug(&OkHttpUtils&)
.setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS)
.setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)
.setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)
.addCommonHeaders(headers)
.addCommonParams(params);
二、普通请求
1.基本的网络请求
OkHttpUtils.get(Urls.URL_METHOD)
.tag(this)
.cacheKey(&cacheKey&)
.cacheMode(CacheMode.DEFAULT)
.execute(new JsonCallback&RequestInfo&(RequestInfo.class) {
public void onResponse(boolean isFromCache, RequestInfo requestInfo, Request request, @Nullable Response response) {
2.请求 Bitmap 对象
OkHttpUtils.get(Urls.URL_IMAGE)
.tag(this)
.execute(new BitmapCallback() {
public void onResponse(boolean isFromCache, Bitmap bitmap, Request request, @Nullable Response response) {
3.请求 文件下载
OkHttpUtils.get(Urls.URL_DOWNLOAD)
.tag(this)
.execute(new FileCallback(&/sdcard/temp/&, &file.jpg&) {
public void onResponse(boolean isFromCache, File file, Request request, @Nullable Response response) {
4.普通Post,直接上传String类型的文本
一般此种用法用于与服务器约定的数据格式,当使用该方法时,params中的参数设置是无效的,所有参数均需要通过需要上传的文本中指定,此外,额外指定的header参数仍然保持有效。
OkHttpUtils.post(Urls.URL_TEXT_UPLOAD)
.tag(this)
.postString(&这是要上传的长文本数据!&)
.execute(new StringCallback() {
public void onResponse(boolean isFromCache, String s, Request request, @Nullable Response response) {
5.普通Post,直接上传Json类型的文本
该方法与postString没有本质区别,只是数据格式是json,一般来说,需要自己创建一个实体bean或者一个map,把需要的参数设置进去,然后通过三方的Gson或者fastjson转换成json字符串,最后直接使用该方法提交到服务器。
OkHttpUtils.post(Urls.URL_TEXT_UPLOAD)
.tag(this)
.postJson(&{\&des\&: \&这里面要写标准的json格式数据\&}&)
.execute(new StringCallback() {
public void onResponse(boolean isFromCache, String s, Request request, @Nullable Response response) {
6.请求功能的所有配置讲解
以下代码包含了以下内容:
一次普通请求所有能配置的参数,真实使用时不需要配置这么多,按自己的需要选择性的使用即可多文件和多参数的表单上传,同时支持进度监听自签名网站https的访问,调用setCertificates方法即可为单个请求设置超时,比如涉及到文件的需要设置读写等待时间多一点。Cookie一般情况下只需要在初始化的时候调用setCookieStore即可实现cookie的自动管理,如果特殊业务需要,需要手动额外向服务器传递自定义的cookie,可以在每次请求的时候调用addCookie方法,该方法提供了3个重载形式,可以根据自己的需要选择使用。
OkHttpUtils.get(Urls.URL_METHOD)
.tag(this)
.connTimeOut(10000)
.readTimeOut(10000)
.writeTimeOut(10000)
.cacheKey(&cacheKey&)
.cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)
.setCertificates(getAssets().open(&srca.cer&))
.addInterceptor(interceptor)
.headers(&header1&, &headerValue1&)
.headers(&header2&, &headerValue2&)
.params(&param1&, &paramValue1&)
.params(&param2&, &paramValue2&)
.params(&file1&, new File(&filepath1&))
.params(&file2&, new File(&filepath2&))
.addUrlParams(&key&, List&String& values)
.addFileParams(&key&, List&File& files)
.addFileWrapperParams(&key&, List&HttpParams.FileWrapper& fileWrappers)
.addCookie(&aaa&, &bbb&)
.addCookie(cookie)
.addCookies(cookies)
.execute(new DialogCallback&RequestInfo&(this, RequestInfo.class) {
public void onBefore(BaseRequest request) {
public RequestInfo parseNetworkResponse(Response response) throws Exception{
return null;
public void onResponse(boolean isFromCache, RequestInfo requestInfo, Request request, @Nullable Response response) {
public void onError(boolean isFromCache, Call call, @Nullable Response response, @Nullable Exception e) {
public void onAfter(boolean isFromCache, @Nullable RequestInfo requestInfo, Call call, @Nullable Response response, @Nullable Exception e) {
public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
7.取消请求
每个请求前都设置了一个参数tag,取消则通过OkHttpUtils.cancel(tag)执行。
例如:在Activity中,当Activity销毁取消请求,可以在onDestory里面统一取消。
protected void onDestroy() {
super.onDestroy();
OkHttpUtils.getInstance().cancelTag(this);
8.同步的请求
execute方法不传入callback即为同步的请求,返回Response对象,需要自己解析
Response response = OkHttpUtils.get(&&)
.tag(this)
.headers(&aaa&, &111&)
.params(&bbb&, &222&)
.execute();
三、自定义CallBack使用
目前内部提供的包含AbsCallback, StringCallBack ,BitmapCallback ,FileCallBack ,可以根据自己的需求去自定义Callback
AbsCallback: 所有回调的父类,抽象类StringCallBack:如果返回值类型是纯文本数据,即可使用该回调BitmapCallback:如果请求的是图片数据,则可以使用该回调FileCallBack:如果要做文件下载,则必须使用该回调,内部封装了关于文件下载进度回调的方法
该网络框架的核心使用方法即为Callback的继承使用,详细请看 Demo 源码中callback包下的代码。
因为不同的项目需求,可能对数据格式进行了不同的封装,于是在 Demo 中的进行了详细的代码示例,以下是详细介绍:
CommonCallback:继承自AbsCallback,主要作用是做全局共同请求参数的添加,同样也可以在第一步全局配置的时候设置,效果一样。EncryptCallback:继承自CommonCallback,主要功能是做 Url 参数加密,对每个请求的参数进行编码,防止拦截数据包,篡改数据。JsonCallback:继承自EncryptCallback,一般来说,服务器返回的响应码都包含 code,msg,data 三部分,在此根据自己的业务需要完成相应的逻辑判断,并对数据进行解析,可以使用
Gson 或者 fastjson,将解析的对象返回。DialogCallback:继承自JsonCallback,对需要在网络请求的时候显示对话框,使用该回调。StringDialogCallback:继承自EncryptCallback,如果网络返回的数据只是纯文本,使用该回调BitmapDialogCallback :继承自BitmapCallback,如果网络返回的是Bitmap对象,使用该回调DownloadFileCallBack :继承自FileCallback,如果需要做文件下载,使用该回调
以上基本是包含了大部分的业务逻辑,具体情况请参照demo示例,根据业务需求修改!
四、缓存的使用
使用缓存前,必须让缓存的数据javaBean对象实现Serializable接口,否者会报NotSerializableException。
因为缓存的原理是将对象序列化后直接写入 数据库中,如果不实现Serializable接口,会导致对象无法序列化,进而无法写入到数据库中,也就达不到缓存的效果。
目前提供了四种CacheMode缓存模式
DEFAULT: 按照HTTP协议的默认缓存规则,例如有304响应头时缓存REQUEST_FAILED_READ_CACHE:先请求网络,如果请求网络失败,则读取缓存,如果读取缓存失败,本次请求失败。该缓存模式的使用,会根据实际情况,导致onResponse,onError,onAfter三个方法调用不只一次,具体请在三个方法返回的参数中进行判断。IF_NONE_CACHE_REQUEST:如果缓存不存在才请求网络,否则使用缓存。FIRST_CACHE_THEN_REQUEST:先使用缓存,不管是否存在,仍然请求网络,如果网络顺利,会导致onResponse方法执行两次,第一次isFromCache为true,第二次isFromCache为false。使用时根据实际情况,对onResponse,onError,onAfter三个方法进行具体判断。
无论对于哪种缓存模式,都可以指定一个cacheKey,建议针对不同需要缓存的页面设置不同的cacheKey,如果相同,会导致数据覆盖。
文/廖子尧(简书作者)
原文链接:/p/4c1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 一封书信到樊城 的文章

 

随机推荐