Android的HTTP扩展包OkHttp中的缓存功能使用方法解析
okhttp 可以对 http 响应的内容在磁盘上进行缓存。在进行 http 请求时,如果该请求的响应已经被缓存而且没有过期,okhttp 会直接使用缓存中的响应内容,而不需要真正的发出 http 请求到远程服务器。在创建缓存时需要指定一个磁盘目录和缓存的大小。在代码清单 8 中,创建出 cache 对象之后,通过 okhttpclient 的 setcache 进行设置。通过 response 对象的 cacheresponse 和 networkresponse 方法可以得到缓存的响应和从实际的 http 请求得到的响应。如果该请求的响应来自实际的网络请求,则 cacheresponse 方法的返回值为 null;如果响应来自缓存,则 networkresponse 的返回值为 null。okhttp 在进行缓存时会遵循 http 协议的要求,因此可以通过标准的 http 头 cache-control 来控制响应的缓存时间。
设置响应缓存的示例
public class cacheresponse { public static void main(string[] args) throws ioexception { int cachesize = 100 * 1024 * 1024; file cachedirectory = files.createtempdirectory("cache").tofile(); cache cache = new cache(cachedirectory, cachesize); okhttpclient client = new okhttpclient(); client.setcache(cache); request request = new request.builder() .url("http://www.baidu.com") .build(); response response = client.newcall(request).execute(); if (!response.issuccessful()) { throw new ioexception("服务器端错误: " + response); } system.out.println(response.cacheresponse()); system.out.println(response.networkresponse()); } }
cache-control
cache-control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置cache-control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令有下几种:
public指示响应可被任何缓存区缓存。
private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
(1)no-cache指示请求或响应消息不能缓存
(2)no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
(3)max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
(4)min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
(5)max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
cachecontrol类详细介绍:
1.)常用的函数:如下代码,里面已经加了注释就不一一解释了,每个函数都是对应一个缓存指令设置
final cachecontrol.builder builder = new cachecontrol.builder(); builder.nocache();//不使用缓存,全部走网络 builder.nostore();//不使用缓存,也不存储缓存 builder.onlyifcached();//只使用缓存 builder.notransform();//禁止转码 builder.maxage(10, timeunit.milliseconds);//指示客户机可以接收生存期不大于指定时间的响应。 builder.maxstale(10, timeunit.seconds);//指示客户机可以接收超出超时期间的响应消息 builder.minfresh(10, timeunit.seconds);//指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 cachecontrol cache = builder.build();//cachecontrol
2.)两个cachecontrol常量介绍:
cachecontrol.force_cache; //仅仅使用缓存 cachecontrol.force_network;// 仅仅使用网络
举例,我们设置一个有效期为10秒的cachecontrol
final cachecontrol.builder builder = new cachecontrol.builder(); builder.maxage(10, timeunit.milliseconds); cachecontrol cache = builder.build();
3.)请求时如何使用
final cachecontrol.builder builder = new cachecontrol.builder(); builder.maxage(10, timeunit.milliseconds); cachecontrol cache = builder.build(); final request request = new request.builder().cachecontrol(cache).url(requesturl).build(); final call call = mokhttpclient.newcall(request);// call.enqueue(new callback() { @override public void onfailure(call call, ioexception e) { failedcallback("访问失败", callback); log.e(tag, e.tostring()); } @override public void onresponse(call call, response response) throws ioexception { if (response.issuccessful()) { string string = response.body().string(); log.e(tag, "response ----->" + string); successcallback((t) string, callback); } else { failedcallback("服务器错误", callback); } } }); return call; } catch (exception e) { log.e(tag, e.tostring()); }
以上如果cache没有过去会直接返回cache而不会发起网络请求,若过期会自动发起网络请求。注意:如果您使用force_cache和网络的响应需求,okhttp则会返回一个504提示,告诉你不可满足请求响应。所以我们加一个判断在没有网络的情况下使用
//判断网络是否连接 boolean connected = networkutil.isconnected(context); if (!connected) { request = request.newbuilder().cachecontrol(cachecontrol.force_cache).build(); }
上一篇: Java实现医院管理系统
下一篇: Java中对象的销毁方法分析