设置OkHttp 的缓存策略:没网络直接读取缓存,并且设置缓存生命周期为 30s
自定义 Interceptor
请求策略:没有网络直接读取缓存
public class CacheRequestInterceptor implements Interceptor {
private Context mContext;
public CacheRequestInterceptor(Context context) {
this.mContext = context;
}
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request request = chain.request();
// 没有网路直接读取缓存
if (!isNetworkAvailable()){
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
return response;
}
private boolean isNetworkAvailable(){
return false;
}
}
设置缓存周期
public class CacheResponseInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
// 有网的情况下 30s 之内访问同一接口,会直接读缓存,不会重复访问
Request request = chain.request();
Response response = chain.proceed(request);
// 缓存周期 30s
int maxAge = 30;
return response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
// max-age 是一种特例,既包含缓存策略又包含缓存过期时间
.header("Cache-Control","max-age="+maxAge)
.build();
}
}
如何使用
File file=new File(getExternalCacheDir(),"cache");
// 缓存位置 + 缓存周期
Cache cache = new Cache(file,10*1024*1024);
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
// 请求拦截器:是否读取缓存
.addInterceptor(new CacheRequestInterceptor(this))
// 响应拦截器:设置缓存周期
.addNetworkInterceptor(new CacheResponseInterceptor())
.build();
Request request = new Request.Builder()
.url("")
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.e("TAG", response.cacheResponse()+":"+response.networkResponse());
}
});