这一章我们从应用层面来讲述一下okhttp在一个商城项目中的使用策略。这是我20120-01-01时候的思路。以公司的项目来讲。
首先先科普一下请求头缓存知识:
- noCache(),不使用缓存,使用网络请求
- noStore(),不使用缓存也不存储缓存数据
- maxAge(),缓存的有效时间,超过该时间会重新请求数据
- maxStale(),超过缓存有效时间后,可继续使用旧缓存的时间,之后需要重新请求数据
- minFresh(),增加额外的缓存的有效时间,之后需要重新请求数据
- onlyIfCached(),使用缓存,不使用网络请求
- noTransform(),不接受经过转码的响应
- immutable(),缓存有效时间内,响应不会变化,避免服务器处理304响应
在商城项目中,我们的
- 轮播图数据可以设置为一天一变。
- 底部推荐卡片数据最好是半小时更新一次。
- 首页导航栏数据可以一天更新一次。
- 固定图标资源一个星期更新一次。
- 地区资源一个月更新一次。
以此类推,把更新频率高的资源设置的有限时间可以短,低的则长。
那么我们使用哪个请求头比较好,
可以配合使用max-age 和 only-if-cache 来实现。
max-age设置有限时间则重新请求,
only-if-cache则强制使用缓存资源。
我们每次请求前检查网络是否正常,如有问题则强制更改请求头为强制使用缓存资源,来保证我们的界面不至于难看。
那么我们该怎么使用,
- 配置缓存资源路径大小
- 配置拦截器
String url = "http://publicobject.com/helloworld.txt";
// 缓存目录
File file = new File(Environment.getExternalStorageDirectory(), "a_cache");
.cache(new Cache(file, cacheSize)) // 配置缓存
public class NetCacheInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response originResponse = chain.proceed(request);
//设置响应的缓存时间为60秒,即设置Cache-Control头,并移除pragma消息头,因为pragma也是控制缓存的一个消息头属性
originResponse = originResponse.newBuilder()
.removeHeader("pragma")
.header("Cache-Control", "max-age=10")
.build();
return originResponse;
}
}
我们可以在拦截器中通过 request.url().toString() 来获取到请求地址,根据不同的请求地址来配置不同的过期时间,不过在配置之前我们应该先判断网络是否正常。
需要注意的是我们使用缓存需要在返回的时候关闭body()
response.body().close();
否则缓存无效
- 配置缓存路径
- 配置拦截器
- 检查网络
- 通 设置 max-age
- 不痛 强制使用缓存 only-if-cache
- 检查网络