如何更新OkHttp缓存

时间:2015-11-18 13:10:06

标签: android caching okhttp httpresponsecache

在我的Android应用程序中,我使用OkHttp缓存来自服务器的响应。因为我已经实现了如下代码

     private class CacheInterceptor implements Interceptor {

        Context mContext;

        public CacheInterceptor(Context context) {
            this.mContext = context;
        }

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
                request = request.newBuilder()
                        .header(HEADER_MOBILE_OS, Constants.MOBILE_OS)
                        .header(HEADER_APP_VERSION, BuildConfig.VERSION_NAME)
                        .build();
            Response response = chain.proceed(request);

            if (!mShouldUpdateCache) {
                response.newBuilder()
                        .header("Cache-Control", String.format("max-age=%d", CACHE_MAX_AGE)).build();
            } else {
//update cache in this case
                response.newBuilder()
                        .header("Cache-Control", "no-cache").build();
                mShouldUpdateCache = false;
            }
            return response;
        }
    }

这是我的拦截器类,我将其设置为OkClient,如下所示

okHttpClient.networkInterceptors().add(new CacheInterceptor(context));

    File httpCacheDirectory = new File(context.getCacheDir(), "response_cache");
    Cache cache = new Cache(httpCacheDirectory, CACHE_SIZE);

    if (cache != null) {
        okHttpClient.setCache(cache);
    }

但问题是,当布尔值mShouldUpdateCache变为真时,我必须更新缓存。现在我写了response.newBuilder().header("Cache-Control", "no-cache").build();但它既没有更新缓存也没有从服务器获取,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

我怀疑您的网络拦截器不会执行从缓存提供的响应,因为网络不用于这些请求。从interceptors doc开始,网络拦截器“未调用网络短路的缓存响应。”

在客户端上黑客攻击标头是进行HTTP缓存的一种脆弱方法。您应该使用适当的请求标头,并为您的网络服务器设置适当的响应标头。