我正在使用DefaultHTTPClient
來進行一些HTTP GET請求。我想強制緩存一週的所有HTTP響應。通過文檔和一些SO回答後,我已經這樣做了:如何強制緩存我所有的HTTP響應?
我通過我主要活動的onCreate
方法安裝了HttpResponseCache
。
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);
}
我加了一個自定義的HttpResponseInterceptor
我的HTTP客戶端,但我仍然沒有得到緩存命中。下面是解壓gzip壓縮的內容我的反應攔截,剝離緩存頭,並增加了一個自定義的:
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;
我似乎無法找出什麼我做錯了。你們中的任何人都知道嗎?
Idk什麼'HttpResonseCache'可以做,但你可以創建一個文件緩存封裝HttpClient手動或者你可以嘗試使用'HttpUrlConnection'它有緩存,因爲ICS http://android-developers.blogspot.de/2011/09/androids -http-clients.html – zapl
有一個叫做緩存控制的標題信息,我不確定它可以幫忙或沒有幫助,但是如果你仍然想知道該怎麼做,請對此進行一些研究。 –
@Dhruvenkumar Shah,如果你看看我的代碼,你會看到我手動設置'Cache-Control'頭。 –