[参考文档]{http://mushuichuan.com/2016/03/01/okhttpcache/}
###okhttp缓存
服务器支持本地缓存
如果服务器支持缓存,请求返回的Response会带有这样的Header:Cache-Control, max-age=xxx,这种情况下我们只需要手动给okhttp设置缓存就可以让okhttp自动帮你缓存了。这里的max-age的值代表了缓存在你本地存放的时间,可以根据实际需要来设置其大小。
首先我们要提供了一个文件路径用来存放缓存,出于安全性的考虑,在Android中我们推荐使用Context.getCacheDir()来作为缓存的存放路径,另外还需要指定缓存的大小就可以创建一个缓存了。如下所示:
OkHttpClient okHttpClient = new OkHttpClient();
OkHttpClient newClient = okHttpClient.newBuilder()
.cache(cache)
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
务器不支持缓存
如果服务器不支持缓存就可能没有指定这个头部,或者指定的值是如no-store等,但是我们还想在本地使用缓存的话要怎么办呢?这种情况下我们就需要使用Interceptor来重写Respose的头部信息,从而让okhttp支持缓存。
如下所示,我们重写的Response的Cache-Control字段
private static File cacheFile = new File(MyApplication.mcontext.getCacheDir().toString(), "cache");
static int cacheSize = 10 * 1024 * 1024;
private static Cache cache = new Cache(cacheFile, cacheSize);
private final static OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response originResponse = chain.proceed(request);
Log.e("ljl", "请求地址====" + request.url());
Headers headers = request.headers();
RequestBody body = request.body();
for (int i = 0; i < headers.size(); i++) {
Log.e("ljl", headers.name(i) + "========" + headers.value(i));
}
return originResponse.newBuilder().removeHeader("pragma").removeHeader("Cache-Control").header("Cache-Control", "max-age=" + 3600 * 24 * 30).build();
}
}).cache(cache)
.build();
很简单的方式就能实现okhttp的网络数据缓存