Нужен пример HttpResponseCache в Android
Привет! Я пытаюсь использовать HttpResponseCache, представленный в Android 4. Документы ясно говорят о том, как установить кэш, но я совершенно не знаю, как кэшировать изображения, загруженные из сети. Ранее я использовал DiskLruCache для их кеширования., Кто-нибудь указывает мне на некоторые примеры работающего кода, где HttpResponseCache был использован..
Редактировать:- Может кто-нибудь сказать мне, что я делаю не так здесь:-
MainActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
final File httpCacheDir = new File(getCacheDir(), "http");
try {
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
Log.v(TAG,"cache set up");
} catch (Exception httpResponseCacheNotAvailable) {
Log.v(TAG, "android.net.http.HttpResponseCache not available, probably because we're running on a pre-ICS version of Android. Using com.integralblue.httpresponsecache.HttpHttpResponseCache.");
try{
com.integralblue.httpresponsecache.HttpResponseCache.install(httpCacheDir, httpCacheSize);
}catch(Exception e){
Log.v(TAG, "Failed to set up com.integralblue.httpresponsecache.HttpResponseCache");
}
}
TheMainListFrag gf=(TheMainListFrag) getSupportFragmentManager().findFragmentByTag("thelistfrags");
if(gf==null){
gf=TheMainListFrag.newInstance();
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
ft.replace(R.id.thelefty, gf,"thelistfrags");
ft.commit();
}
}
Затем в загрузчике TheMainListFrag я делаю следующее:
public ArrayList<HashMap<String,String>> loadInBackground() {
String datafromServer = null;
ArrayList<HashMap<String,String>> al = new ArrayList<HashMap<String,String>>();
try {
String url = "someurl";
HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
urlConnection.setRequestProperty("Accept", "application/json");
InputStream is = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
datafromServer=sb.toString();
Log.v("fromthread",datafromServer);
// etc
//etc
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
Log.v("fromthread", e.getClass() + "--" + e.getMessage());
}
return al;
}
Когда я подключен к Интернету, он работает нормально, и в каталоге http- каталоге кэша, указанном выше, я тоже вижу файлы. Но когда я не подключен к Интернету, данные отказываются загружаться.
Когда я загружаю изображения из сети, я вижу файлы кэша с именем.tmp, которые, как я полагаю, называются грязными согласно DiskLruCache.
Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которую вы хотите, чтобы я предоставил
3 ответа
Из раздела Force Cache Response в документации HttpResponseCache:
Иногда вы захотите показать ресурсы, если они доступны сразу, но не иначе. Это можно использовать, чтобы ваше приложение могло что- то показать, ожидая загрузки последних данных. Чтобы ограничить запрос локально кэшированными ресурсами, добавьте
only-if-cached
директива:
try {
connection.addRequestProperty("Cache-Control", "only-if-cached");
InputStream cached = connection.getInputStream();
// the resource was cached! show it
} catch (FileNotFoundException e) {
// the resource was not cached
}
Этот метод работает даже лучше в ситуациях, когда устаревший ответ лучше, чем отсутствие ответа. Чтобы разрешить устаревшие кэшированные ответы, используйте
max-stale
директива с максимальной выдержкой в секундах:
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
connection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
В моем случае HttpResponseCache фактически ничего не кэшировал. Что исправлено было просто:
connection.setUseCaches(true);
(Это должно быть вызвано на HttpURLConnection
до установления соединения.)
Для более тонкого контроля, max-stale
можно использовать, как указал Джесси Уилсон.
Когда вы включаете HttpResponseCache
, все HttpUrlConnection
запросы будут кешироваться. Вы не можете использовать его для кэширования произвольных данных, поэтому я рекомендую продолжать использовать DiskLruCache
для этого.