嗨,我正在尝试使用
Android 4中引入的HttpResponseCache.该文档清楚地说明如何安装缓存,但是我完全失去了如何缓存从网络下载的图像.更早我正在使用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被认为是脏的.
请让我知道,如果有任何其他信息,你要我提供
解决方法
从
HttpResponseCache documentation强制缓存响应部分:
Sometimes you’ll want to show resources if they are available
immediately,but not otherwise. This can be used so your application
can show @H_301_24@something while waiting for the latest data to be
downloaded. To restrict a request to locally-cached resources,add the
only-if-cached
directive:
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 }
This technique works even better in situations where a stale response
is better than no response. To permit stale cached responses,use the
max-stale
directive with the maximum staleness in seconds:
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale connection.addRequestProperty("Cache-Control","max-stale=" + maxStale);