2014-03-18 2 views
2

Я пытаюсь использовать HttpResponseCache, но мне не повезло, что он работает.Android HttpResponseCache не работает

Я устанавливаю это так:

 SdCardManager manager = SdCardManager.getSdCardManager(context); 
     File dir = new File(manager.getAbsolutePathForSdCardFile(""), "http"); 
     Log.e("Test", "Installing cache to " + dir.getAbsolutePath()); 
     HttpResponseCache.install(dir, 10 * 1024 * 1024); 

и мой код соединения:

try{ 
     URL url = new URL(mUrl); 

     HttpURLConnection connection = (HttpURLConnection) ((mProxy == null) ? url 
       .openConnection() : url.openConnection(mProxy.getProxy())); 

     HttpResponseCache cache = HttpResponseCache.getInstalled(); 
     Log.e("Test", "Req count: " + cache.getRequestCount() + " hit count " + cache.getHitCount() + " size = " + cache.size()); 

     connection.setUseCaches(true); 
     connection.setDefaultUseCaches(true); 
     connection.addRequestProperty("Cache-Control", "max-stale=" + (60 * 60 * 24 * 28)); 

     applyHeaders(connection); 
     connection.setRequestMethod("GET"); 
     connection.setConnectTimeout(mTimeout); 
     connection.setReadTimeout(mTimeout); 

     connection.connect(); 

     mStatusCode = connection.getResponseCode(); 
     mStatusMessage = connection.getResponseMessage(); 

     connection.disconnect(); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
     return false; 
    } 

Глядя в ADB оболочки, я вижу, каталог кэша создается и есть файл журнала. Однако, нет больше данных когда-либо отправляется в каталог:

[email protected]:/storage/emulated/legacy/Android/data/com.snip.pre/files/http $ ls 
journal 

Я очистить кэш после каждого запроса:

HttpResponseCache cache = HttpResponseCache.getInstalled(); 
cache.flush(); 

Любые идеи, что я делаю не так? Заголовки ответов серверов находятся здесь:

GET /imgv.oms/0.0.1fd02.a7003c2a HTTP/1.1 
Cache-Control: max-stale=2419200 
Authorization: Basic bWFydGlubDppc2lz 
X-Loginpageredirect: none 
Accept: image/* 
Accept-Encoding: gzip,deflate 
Accept-Language: en-GB 
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.3; Galaxy Nexus Build/JWR66Y) 
Host: appsdev2.server.com:81 
Connection: Keep-Alive 
Cookie: POSESSIONID=F8654323-f7frSyNmAGKsvE4nFXZJQIIy3Io 

Есть ли что-то, что мешает его кешировать?

+0

Вы уверены, что ваш ресурс доступен? – njzk2

+0

Что именно определяет кешируемость? Что-то в заголовках вернулось? Я попробовал это с некоторым Json и изображением пинты, получившим тот же результат. Кроме того, одно и то же содержимое кэшируется без проблем на эквивалентном клиенте iOS. – steprobe

+0

есть. Заголовки сервера определяют, можно ли кэшировать объект и как долго. – njzk2

ответ

1

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

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html раздел 14.8

Сервер не позволяет мне кэшировать результат, как и njzk2 намекал тоже.

+0

Итак, как вам удалось получить кеширование? –

+0

Я только отправляю заголовок авторизации при входе в систему и с этого времени использую файлы cookie. – steprobe

+0

Таким образом, это означает, что в моем запросе есть заголовок аутентификации, который нельзя кэшировать –

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