OKHttp3 最大陈旧缓存

OKHttp3 max-stale cache

我开始使用缓存和 Retrofit/OKHttp3 Android。我们需要为我们的应用程序支持离线 mode/server down,我正在尝试弄清楚如何正确配置缓存以支持它。这个想法是在服务器可用时从服务器获取新副本(如果没有任何更改,则返回 304)。如果服务器关闭或应用程序离线,我们需要获取缓存的响应。

我这样配置缓存控制:

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

这很好用,但我不明白为什么即使 "max-stale" 已通过,OKHttp 仍提供缓存的响应?我以为 50 秒后我会收到一个 504 - Unsatisfiable request 因为 max-stale period 已经过去了?

这是我用于 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();
}

关于如何配置缓存以便它在最大陈旧期过后不再提供缓存的响应有什么想法吗?

一如既往,在你提出问题后你就会找到答案。我知道即使在最大陈旧期过去后,缓存仍会继续提供内容,因为我使用了 CacheControl.FORCE_CACHE。这会添加一个 "only-if-cache" 标志,并且还将 max-stale 设置为一个非常高的值,该值会覆盖服务器首先传递的 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();
}