教你如何使用okhttp缓存
2016-04-21 20:07
489 查看
okhttp还是蛮方便的,我比较喜欢的一个就是它支持get请求返回的数据进行缓存,官网介绍得很简单,懂了话用起来确实挺方便的,不懂的话也就比较折腾了,这里简单说一下我的理解与使用小结,不对之处请指出、一起探讨。使用方法很简单:
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); return originalResponse.newBuilder().removeHeader("Pragma") .header("Cache-Control", String.format("max-age=%d", 10)).build();//设置了缓存时间为10秒 } }; private static String cachedirectory = Environment.getExternalStorageDirectory() + "/lancoo/caches"; private static Cache cache = new Cache(new File(cachedirectory), cacheSize);
public static Call doGet(RequestParams param, Callback callback) { String url = param.getUrl(); int timeout = param.getTimeout(); OkHttpClient okHttpClient; OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(timeout, TimeUnit.MILLISECONDS); if (param.isUsecache()) { builder.cache(cache); builder.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR); } okHttpClient = builder.build(); Request request = new Request.Builder() .url(url).build(); Call call = okHttpClient.newCall(request); call.enqueue(callback); return call; }我们将请求返回的数据打印出来:上面图片的1是点击获取的服务器的数据,获取后断开网络然后继续点击,可以看到2还能获取到数据,说明这是缓存的数据,当到3时,差不多就是十秒的时间,可以看到,获取数据失败了,这时已经去服务器获取数据了,缓存被清空,由于断开网络是无法获取到数据的。除了通过拦截器控制缓存数据之外,还有一个CacheControl可以控制缓存数据,它有两个方法:
new CacheControl.Builder() .maxAge(0, TimeUnit.SECONDS)//这个是控制缓存的最大生命时间[/code]
new CacheControl.Builder().maxStale(365, TimeUnit.DAYS)//这个是控制缓存的过时时间
这个跟上面的控制缓存的时间有什么区别?一开始我也不懂,发现如果.maxAge(0, TimeUnit.SECONDS)设置的时间比拦截器长是不起效果,如果设置比拦截器设置的时间短就会以这个时间为主,我觉得是为了方便控制。.maxStale(365, TimeUnit.DAYS)设置的是过时时间,我觉得okthhp缓存分成了两个来考虑,一个是为了请求时直接拿缓存省流量,一个是为了下次进入应用时可以直接拿缓存。[/code][/code]
下面我验证了一下:设置maxAge为15秒,maxStale40秒,结果如下:[/code][/code]
在图1处获取到数据后断开网络,接下来还能获取到缓存数据,到2出退出应用,到3出是重新进入应用,这时还是断开网络的状态,可以看到还能获取到数据,到了4处发现获取不到数据了。
按道理来说在3处已经超过15秒了应该获取不到数据了可是结果还能获取到数据,到了4时已经超过40秒了,于是缓存清空了。
所以可以知道如果两个都设置了的话,maxStale才是决定缓存过时不过时,过时了才会清空掉,如果只设置maxAge,那么超过maxAg的期限才会被情况,感觉两个的作用是一样。
相关文章推荐
- OSI七层与TCP/IP五层网络架构详解
- 网络字节码、本地字节码(大端,小端)
- Http错误代码总结
- openstack新建虚机、网络、路由时候对应的ovs网桥的变化
- case编写的httpd简单启停脚本
- Volley,小并发网络请求的好帮手
- Volley,小并发网络请求的好帮手
- Http 请求原理简介
- wcf的wcfdualHTTPBinding的调用严重慢的问题
- 浅谈Http协议
- 计算机网络自顶向下方法之一一一第一章 之一
- 神经网络概述
- 为何说TCP是可靠连接而UDP是不可靠连接
- (网络层)IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)
- 计算机网络概述
- TCP协议详解(理论篇)
- http的get和post请求
- 开源框架OKHttp的使用02-封装后的OkHttpUtils
- 学习心得-------计算机网络基础(1)
- android请求网络-第三方库Android-async-http库的使用(5)