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}); }
参考
相关文章推荐
- 经典抓取网络数据方法效率分析(fsockopen/curl/file_get_contents)
- 【源代码分析】tinyhttpd学习
- 大端字节序、小端字节序、主机字节序、网络字节序
- TCP/IP篇--各协议简介
- 神经网络入门基础知识 neural networks basics
- 欢迎使用CSDN-markdown编辑器
- 神经网络算法
- PHP经典抓取网络数据方法
- iOS9网络适配 info.plist配置
- acdreamoj 1211 【有上下界限制的网络流】
- hdu 5439 Aggregated Counting(长春网络赛——找规律+二分)
- 广域网模拟器—WANem安装使用教程
- Servlet以及HttpServlet的源码分析
- APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例
- 计算机网络中常见设备
- HttpURLConnection中使用代理(Proxy)及其验证(Authentication)
- HttpURLConnection中使用代理(Proxy)及其验证(Authentication)
- Linux 网络设备驱动开发(三) —— 网络设备驱动基本原理和框架
- Android AsyncHttpClient 的简单用法
- httpClient中的三种超时设置小结