我正在使用DefaultHTTPClient
发出一些HTTP GET请求。我想强制缓存一周的所有HTTP响应。在完成文档和一些SO答案之后,我已经完成了这个:
我通过主要活动的HttpResponseCache
方法安装了onCreate
。
try {
File httpCacheDir = new File(getApplicationContext().getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) {
Log.i("dd", "HTTP response cache installation failed:" + e);
}
我为我的HTTP客户端添加了自定义HttpResponseInterceptor
,但我仍然没有获得缓存命中。这是我的响应拦截器解压缩GZIPped内容,剥离缓存标头并添加自定义缓冲区:
class Decompressor implements HttpResponseInterceptor {
public void process(HttpResponse hreResponse, HttpContext hctContext) throws HttpException, IOException {
hreResponse.removeHeaders("Expires");
hreResponse.removeHeaders("Pragma");
hreResponse.removeHeaders("Cache-Control");
hreResponse.addHeader("Cache-Control", "max-age=604800");
HttpEntity entity = hreResponse.getEntity();
if (entity != null) {
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
hreResponse.setEntity(new HttpEntityWrapper(entity) {
@Override
public InputStream getContent() throws IOException, IllegalStateException {
return new GZIPInputStream(wrappedEntity.getContent());
}
@Override
public long getContentLength() {
return -1;
}
});
return;
}
}
}
}
}
}
以下是我提出要求的方式:
String strResponse = null;
HttpGet htpGet = new HttpGet(strUrl);
htpGet.addHeader("Accept-Encoding", "gzip");
htpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1");
DefaultHttpClient dhcClient = new DefaultHttpClient();
dhcClient.addResponseInterceptor(new Decompressor(), 0);
HttpResponse resResponse = dhcClient.execute(htpGet);
Log.d("helpers.network", String.format("Cache hit count: %d", HttpResponseCache.getInstalled().getHitCount()));
strResponse = EntityUtils.toString(resResponse.getEntity());
return strResponse;
我似乎无法确定我做错了什么。你们中的任何人都知道吗?
答案 0 :(得分:0)
不确定这是否回答了您的问题,但是您是否考虑过只使用Android自己的缓存目录添加客户端缓存,而不是依赖HTTP服务器来解释您的缓存控制标头?
我们在点火时所做的只是将服务器响应写入磁盘作为字节流,从而完全控制缓存(和过期缓存。)
有一个示例应用here,但它需要您使用库的HTTP API(但是,它只是HttpClient的一个薄包装。)或者只是看看缓存的工作原理并从那里开始
答案 1 :(得分:0)
我对此失败了。根据Android文档,它具体说明了HttpResponseCache
- “缓存对文件系统的HTTP和HTTPS响应,因此可以重用它们,节省时间和带宽。这个类支持HttpURLConnection和HttpsURLConnection;没有平台为DefaultHttpClient或AndroidHttpClient提供的缓存。“
所以那就是了。
现在Apache的HTTP客户端有一个CachingHttpClient
,这个新版本的HTTP客户端已通过this project反向移植到Android。当然,我可以使用它。
我不想使用Apache HTTP客户端库的hackish版本,所以有一个想法是从HTTP客户端中蚕食缓存相关位并自己重新开始,但这太过分了。
我甚至考虑按照建议移动到推荐的HttpURLConnection
课程,但我遇到了其他问题。该类似乎没有良好的cookie持久性实现。
无论如何,我跳过了一切,但是。我通过缓存减少加载时间,为什么不进一步,因为我使用jSoup从页面中抓取记录并创建ArrayList
自定义结构,我不妨序列化整个{ {1}}在我的结构上实施ArrayList
方法。现在我不必等待页面请求,我不必等待jSoup解析缓慢。取胜。