微信号:gh_a58345f58216

介绍:Android高手进阶之路,让我们共同学习,每天进步一点点.http://wuxiaolong.me/

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

2016-04-15 08:32 ping

本文是我群里的小伙伴ping的投稿,分享关于他对Okhttp的一些理解。感谢作者ping的投稿。

为了鼓励大家积极投稿,并有优质文章,这里所有投稿文章的赞赏收入,都归原作者。投稿说明见:投稿AndroidProgrammer,再次感谢投稿小伙伴们。


作者:ping

原文链接:http://georgeyang.cn/blog/read?id=312101314061

由于微信公众号不支持外链,要想了解更多,可以点击底部「阅读原文」跳转至原文。

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);
    }
    return response = (Response) cacheGetMothod.invoke(cache,new Object[]{request});
}

参考

http://www.jianshu.com/p/9c3b4ea108a7



微信公众号:AndroidProgrammer


长按二维码识别一键关注

 
AndroidProgrammer 更多文章 吴小龙同學 Android开发人员调查 Android Toolbar 原来这个是你做的啊 手把手教你建github技术博客by hexo
猜您喜欢 调查:Java程序员最伤心,C++程序员最年老 影响编程效率的15个障碍 移动开发每周阅读清单:WWDC直播、全民K歌增量升级方案 编程面试中的 10 个常见错误 Mouseflow-网站分析和实时用户研究工具