2015-12-02 4 views
1

Я работаю над приложением на Android, которое имеет большую нагрузку на запросы веб-сервисов.HTTPResponseCache хранит, но никогда не удаляет

У меня уже есть функция LoginActivity, в которой пользователь вводит имя пользователя, пароль и ответы сервера с результатом и токеном. Затем несколько действий (все они простираются от общей BaseActivity) выполняют тяжелые запросы.

У меня также есть класс ServiceManager, который отвечает за все запросы на обслуживание и запросы HTTP.

Я работаю над реализацией HttpResponseCache, чтобы уменьшить эту сетевую нагрузку. Сейчас у меня есть следующий код:

В моей LoginActivity-х (первый из которых запущен) OnCreate:

//HTTP cache 
try { 
    File httpCacheDir = new File(this.getCacheDir(), "http"); 
    long httpCacheSize = 10 * 1024 * 1024; //10 MiB 
    HttpResponseCache.install(httpCacheDir, httpCacheSize); 
    Log.d(TAG, "Cache installed"); 
} catch (IOException e) { 
    Log.i(TAG, "HTTP response cache installation failed:" + e); 
} 

В HTTPRequest функции моего ServiceManager, которая является один фактически выполняется каждый раз, когда я пытаюсь сделать запрос HTTP:

//HTTPS connection 
URL requestedUrl = new URL(uri); 
httpsConnection = (HttpURLConnection) requestedUrl.openConnection(); 
httpsConnection.setUseCaches(true); 
httpsConnection.setDefaultUseCaches(true); 
httpsConnection.setRequestMethod("GET"); 

BufferedReader br = new BufferedReader(
      new InputStreamReader(httpsConnection.getInputStream())); 
String line; 
while ((line = br.readLine()) != null) { 
    httpResponse += line; 
} 

br.close(); 
httpsConnection.disconnect(); 

HttpResponseCache cache = HttpResponseCache.getInstalled(); 

Log.d(TAG, "Cache: " + cache); 
if (cache != null) { 
    Log.d(TAG, "Net count: " + cache.getNetworkCount()); 
    Log.d(TAG, "Hit count: " + cache.getHitCount()); 
    Log.d(TAG, "Request count: " + cache.getRequestCount()); 

    cache.flush(); 
} 
try{ 
    URI uriCached = new URI("<myurl>"); 
    CacheResponse cr = cache.get(uriCached, "GET", null); 
    String line; 
    BufferedReader br = new BufferedReader(new InputStreamReader(cr.getBody())); 
    while ((line = br.readLine()) != null) { 
     Log.d(TAG, line); 
    } 
} catch (URISyntaxException e1) { 
    e1.printStackTrace(); 
} catch (IOException e2) { 
    e2.printStackTrace(); 
} 

Прямо сейчас, так как на стороне сервера не готов, URL я делаю запросы к является всегда то же самое.

Как вы можете видеть, я отладки несколько вещей, эти результаты:

  • Cache установлен
  • Cache: [email protected]
  • Net Количество: Х
  • Количество
  • Хит: 0
  • Запрос Количество: X
  • {myJson}

Как вы можете видеть, кеш способен читать мой JSON, когда я получаю его с помощью метода cache.get(), но он никогда не попадает.

Моей стороны сервера директива Cache-Control в заголовке ответа является: Cache-Control: общественный Cache-Control: макс возраст = 3800

Почему не кэш никогда не бил?

спасибо!

ответ

0

Я нашел проблему.

Я пытался кэшировать петиции на PHP, который возвращает JSON. PHP всегда рассматривается как динамический контент (и на самом деле он), и он никогда не кэшируется.

Путь к использованию при попытке кэширования JSON только на стороне приложения, а не на стороне сервера. Таким образом, это не событие делает запрос.

Лучший.

EDIT

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

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