2016-02-10 3 views
1

Я начинаю с кэширования и дооснащения/OKHttp3 в Android. Нам нужно поддерживать автономный режим/сервер для нашего приложения, и я пытаюсь понять, как правильно настроить кеш, чтобы это поддержать. Идея состоит в том, чтобы получить новую копию с сервера, когда она доступна (или 304, если ничего не изменилось). Если сервер выключен или приложение отключено, нам нужно получить кешированный ответ.OKHttp3 max-stale cache

я настроил Cache-контроль, как это:

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

Это работает довольно хорошо, но то, что я не понимаю, почему OKHttp служит кэшированный ответ, даже если «макс-несвежий» прошло? Я думал, что через 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(); 
} 

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

ответ

2

Как всегда, после того, как вы зададите вопрос, вы найдете ответ. Я понимаю, что кеш продолжает обслуживать контент даже после того, как прошел максимальный срок, потому что я использовал CacheControl.FORCE_CACHE. Это добавляет флаг «только-если-кеш», а ТАКЖЕ устанавливает максимальный уровень в очень высокое значение, которое переопределяет значение 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(); 
} 
+0

Не забудьте принять свой собственный ответ. :) –

Смежные вопросы