您的位置:首页 > 理论基础 > 计算机网络

OKhttp2.6强制请求缓存,通过反射自由读取缓存数据

2016-04-13 22:42 686 查看

1.OKhttp配置缓存

OkHttpClient okHttpClient = new OkHttpClient();
File cacheFile = new File(context.getCacheDir(), "netCache"
Cache cache = new Cache(cacheFile, 1024 * 1024 * 10); //10Mb
okHttpClient.setCache(cache);


2.强制缓存

OKhttp缓存默认根据请求服务器后返回的Cache-Control请求头控制,如果我们需要强制缓存,可以给okHttpClient添加一个拦截器添加Cache-Control参数,代码如下:

okHttpClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.header("Cache-Control", "max-age=3600")//1小时缓存
.build();
}
});


博客出处

如果你使用的是Retrofit框架,建议这样写:

@Headers("Cache-Control: public, max-age=3600)
@GET("merchants/{shopId}/icon")
Observable<ShopIconEntity> getShopIcon(@Path("shopId") long shopId);


okHttpClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
//使用@Headers指定的缓存请求头
String cacheControl = request.cacheControl().toString();
return originalResponse.newBuilder()
.header("Cache-Control", cacheControl)
.build();
}
});


3.通过反射自由获取已存在的网络缓存:

通过

Cache cache = okHttpClient.getCache();

获得缓存Cache,但里面没有公开的方法获取获取缓存,看Cache源码:



有一个get方法可以通过使用request获取response请求结果,但不是public的,此时我们需要使用反射调用该方法获取缓存。代码如下:

private static Method cacheGetMethod;

public Response getCache(Request request) {
Cache cache = okHttpClient.getCache();
if (cacheGetMethod==null) {
cacheGetMethod = cache.getClass().getDeclaredMethod("get",new Class[]{Request.class});
cacheGetMethod.setAccessible(true);
}
response = (Response) cacheGetMothod.invoke(cache,new Object[]{request});
}


参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: