Максимально устаревший кеш OKHttp3

Я начинаю с кеширования и Retrofit/OKHttp3 в Android. Нам нужно поддерживать автономный режим/отключение сервера для нашего приложения, и я пытаюсь выяснить, как правильно настроить кеш для поддержки этого. Идея состоит в том, чтобы получить свежую копию с сервера, когда она будет доступна (или 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();
}

Любые идеи, как настроить кеш, чтобы он не обслуживал кешированный ответ после того, как прошел период максимального устаревания?


person exkoria    schedule 10.02.2016    source источник


Ответы (1)


Как всегда, задав вопрос, найдешь ответ. Я понимаю, что кеш продолжает обслуживать контент даже после того, как прошел период максимального устаревания, потому что я использовал CacheControl.FORCE_CACHE. Это добавляет флаг «only-if-cache» и ТАКЖЕ устанавливает для max-stale очень высокое значение, которое переопределяет значение max-stale, переданное сервером в первую очередь. Я решил это, создав еще один элемент управления кешем с максимальным устаревшим значением, которое я определяю:

    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();
}
person exkoria    schedule 10.02.2016