12

嗨,我正在尝试使用 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 将其称为脏文件。

如果您希望我提供任何其他信息,请告诉我

4

3 回答 3

11

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);
于 2012-07-30T00:12:25.993 回答
1

启用HttpResponseCache后,所有HttpUrlConnection查询都将被缓存。您不能使用它来缓存任意数据,因此我建议您继续使用DiskLruCache它。

于 2012-07-20T18:21:30.433 回答
1

就我而言,HttpResponseCache 实际上并没有缓存任何东西。解决它的方法很简单:

connection.setUseCaches(true);

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

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

于 2013-10-31T16:52:34.740 回答