2015-11-18 2 views
0

В моем приложении Android я кэширую ответы с сервера с помощью OkHttp. для этого я реализовал код следующегоКак обновить кеш 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

Я подозреваю, что ваш сетевой перехватчик не выполняется для ответов, поданных из кеша, поскольку сеть не используется для этих запросов. Из interceptors doc, сетевые перехватчики «Не вызывается для кэшированных ответов, короткого замыкания в сети.»

Взлом заголовки ответа на клиенте является хрупким способ сделать кэширование HTTP. Вы должны использовать соответствующие заголовки запросов и заставить ваш веб-сервер устанавливать соответствующие заголовки ответов.

+0

Я не понял на самом деле, не могли бы вы объяснить на примере? – droidev

+0

@VividVervet 1) Ваш «перехватчик», вероятно, не вызывается, потому что он добавляется к сетевым перехватчикам (которые не вызывают, когда сеть не используется для запроса). 2) Вы действительно не должны возиться с кешированием HTTP на уровне приложения. Исправьте свой веб-сервер. –

+0

@NightlyNexus перехватчик вызывает и кеширует работает отлично, но я не могу обновить кэш вручную – droidev

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