在Android中需要一个HttpResponseCache的例子

您好我正在尝试使用Android 4中引入的HttpResponseCache。文档做清楚说明如何安装caching,但我完全损失如何caching从网上下载的图像。早先我使用DiskLruCache来caching它们。 任何人都可以指向我使用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 – 上面提到的caching目录,我也可以看到这些文件。 但是,当我没有连接到互联网,数据拒绝加载。

当我从networking加载图像时,我看到名为.tmp的caching文件,我认为这被称为根据DiskLruCache脏。

请让我知道,如果有任何其他信息,你想我提供

Solutions Collecting From Web of "在Android中需要一个HttpResponseCache的例子"

从HttpResponseCache文档 强制caching响应部分:

有时你会想要显示资源,如果他们立即可用,但不是。 这可以用来让您的应用程序可以显示的东西,而等待最新的数据下载。 要限制对本地caching资源的请求,请添加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 } 

这种技术在陈旧响应比没有响应好的情况下效果更好。 要允许陈旧的caching响应,请使用max-stale指令以秒为单位的最大陈旧度:

 int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale connection.addRequestProperty("Cache-Control", "max-stale=" + maxStale); 

当您启用HttpResponseCache ,所有HttpUrlConnection查询将被caching。 你不能用它来caching任意数据,所以我build议你继续使用DiskLruCache

在我的情况下HttpResponseCache实际上并没有caching任何东西。 什么修复它只是简单的:

 connection.setUseCaches(true); 

(这必须在build立连接之前在HttpURLConnection上调用。)

对于更细粒度的控制, Jesse Wilson指出可以使用max-stale