1. okhttp框架拥有很好的缓存策略CacheStrategy,并使用DiskLruCache技术对响应的内容进行存储。要建立缓存,要有以下条件:


可以读写的缓存目录

缓存大小的限制

缓存目录应该是私有的,不信任的程序不能读取缓存内容

全局用户唯一的缓存访问实例。okhttp框架全局必须只有一个OkHttpClient实例(new OkHttpClient()),并在第一次创建实例的时候,配置好缓存。


2. okhttp框架获取响应数据有三种方法:

/***返回网络上的数据。如果没有使用网络,则返回null。*/publicResponsenetworkResponse()/***返回缓存中的数据。如果不使用缓存,则返回null。对应发送的GET请求,缓存响应和网络响应*有可都非空。*/publicResponsecacheResponse()publicResponsepriorResponse()


3. 代码

设置缓存目录

OkHttpClientclient=newOkHttpClient();intcacheSize=10*1024*1024;//10MiBFilecacheDirectory=newFile("cache");if(!cacheDirectory.exists()){cacheDirectory.mkdirs();}Cachecache=newCache(cacheDirectory,cacheSize);client.setCache(cache);

强制使用网络响应

Requestrequest=newRequest.Builder().header("Cache-Control","no-cache")//刷新数据.url("http://publicobject.com/helloworld.txt").build();

通过服务器验证缓存数据是否有效

Requestrequest=newRequest.Builder().header("Cache-Control","max-age=0").url("http://publicobject.com/helloworld.txt").build();

强制使用缓存响应

Requestrequest=newRequest.Builder().header("Cache-Control","only-if-cached").url("http://publicobject.com/helloworld.txt").build();

指定缓存数据过时的时间

intmaxStale=60*60*24*28;//4周Requestrequest=newRequest.Builder().header("Cache-Control","max-stale="+maxStale).url("http://publicobject.com/helloworld.txt").build();

注:HTTP header中的max-age 和max-stale区别

max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。