OKHttp3最大缓存

时间:2016-02-10 10:40:29

标签: retrofit cache-control okhttp retrofit2 okhttp3

我开始使用Android中的缓存和Retrofit / OKHttp3。我们需要为我们的应用程序支持离线模式/服务器关闭,并且我试图弄清楚如何正确配置缓存以支持它。我们的想法是在服务器可用时从服务器获取新的副本(如果没有任何更改,则从304获取)。如果服务器关闭或者应用程序处于脱机状态,我们需要获取缓存的响应。

我像这样配置了Cache-control:

Cache-Control: no-transform, max-age=0, max-stale=50, private

这非常好用,但我不明白为什么OKHttp服务于缓存的响应,即使在" max-stale"已经过去了?我认为50秒后我会得到一个504 - 不满意的请求,因为最大陈旧时期已经过去了?

这是我用于OKHttp的拦截器:

.addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        try {
                            if (!NetworkUtil.isNetworkAvailable(model.getApplicationContext())) {
                                return getCachedResponse(chain);
                            }
                            Request request = chain.request();
                            return chain.proceed(request);
                        } catch (Exception exception) {
                            return getCachedResponse(chain);
                        }
                    }
                })

    private static Response getCachedResponse(Interceptor.Chain chain) throws IOException {
    Request request = chain.request().newBuilder()
            .cacheControl(CacheControl.FORCE_CACHE)
            .removeHeader("Pragma")
            .build();

    Response forceCacheResponse = chain.proceed(request);
    return forceCacheResponse.newBuilder()
            .build();
}

任何想法如何配置缓存,以便在最长时间段过后它不会提供缓存的响应?

1 个答案:

答案 0 :(得分:3)

与往常一样,在您提出问题后,您会找到答案。据我所知,即使在最长时间过后,缓存仍继续提供内容,因为我使用了CacheControl.FORCE_CACHE。这会添加一个“only-if-cache”标志,并且还将max-stale设置为一个非常高的值,该值会覆盖服务器首先传递的最大过时值。我通过创建另一个具有我定义的最大陈旧值的cachecontrol来解决它:

    private static Response getCachedResponse(Interceptor.Chain chain) throws IOException {

    CacheControl cacheControl = new CacheControl
            .Builder()
            .onlyIfCached()
            .maxStale(5, TimeUnit.MINUTES).build();

    Request request = chain.request().newBuilder()
            .cacheControl(cacheControl)
            .removeHeader("Pragma")
            .build();

    Response forceCacheResponse = chain.proceed(request);
    return forceCacheResponse.newBuilder()
            .build();
}