前言:
Retrofit本身并没有缓存。OkHttp是由Square发布的一个HTTP client,它支持高速缓存服务器响应的语义。如果服务器的响应具有Cache-Control头,例如,它将被缓存,以便随后的请求可以从高速缓存中的获得之前的资源。
因此,设备处于断网情况下,Retrofit与Okhttp配合可以实现缓存。
Okhttp缓存设计和浏览器设计一样,是用来提升用户体验以及降低浏览器负荷的。项目实际开发过程中,我们使用到的无非两种情景:
1.无论是否有网,一定时间段内都是先读缓存,不同的接口根据自己的实时性可以自定义这个时间段长短
2.没有网络的时候可以读取缓存,有网络时读取在线的最新数据
代码设计来源于实际需求,因而自然而然要求封装的代码对外支持两种缓存策略的选择。
1.基本知识
设置缓存路径
//设置缓存路径 内置存储
File httpCacheDirectory =new File(context.getCacheDir(),"responses");
//外部存储
File httpCacheDirectory =new File(context.getExternalCacheDir(),"responses");
设置缓存大小
int cacheSize =DEFAULT_HTTP_CACHE_SIZE; //设置缓存10M
使用httpCacheDirectory和cacheSize生成对象Cache,用于Okhttp的cache入参
Cache cache =new Cache(httpCacheDirectory,cacheSize);
OkHttpClient.Builder builder =newOkHttpClient.Builder();
builder.cache(cache);
为每个接口设置缓存时间段,max-age 的单位是秒, 表示缓存时长
每个接口设置缓存时间段
设置Interceptor
builder.addInterceptor(baseInterceptor);
设置NetworkInterceptor
builder.addNetworkInterceptor(rewriteCacheControlInterceptor);
2.两种缓存策略
第一种:无论有网没网,一定时间段内都去读取缓存
intercept中关键代码
上层调用代码
OkHttpClient.Builder builder =new OkHttpClient.Builder();
builder.addNetworkInterceptor(rewriteCacheControlInterceptor);
第二种:没网络的情况下读取缓存,有网络时读取最新数据
baseInterceptor关键代码
上层调用代码,如果想实现第二种缓存策略,则必须两个拦截器都加
OkHttpClient.Builder builder =new OkHttpClient.Builder();
builder.addInterceptor(baseInterceptor);
builder.addNetworkInterceptor(rewriteCacheControlInterceptor);
网友评论