我最近将我的应用从使用AndroidHTTPClient切换到使用HttpURLConnection。我试图让HttpURLConnection的缓存功能正常工作,并且没有成功。
这是我执行Http请求的代码
URL url = new URL(currentURL);
ResultAndUrl result = null;
final HttpURLConnection httpUrlConnection = (HttpURLConnection) urll.openConnection();
httpUrlConnection.setUseCaches(true);
try {
InputStream in = new BufferedInputStream(httpUrlConnection.getInputStream());
result = new ResultAndUrl();
result.result = convertStreamToString(in);
result.url = currentURL;
} catch (final Exception e) {
try {
Log.e("NETWORK", e.getMessage());
} catch (Exception ee) {
}
} finally {
try {
httpUrlConnection.disconnect();
} catch (Exception e) {
}
}
同样在我的Application类中我有
public void enableHttpResponseCache() {
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);
} catch (Exception httpResponseCacheNotAvailable) {
try{
HttpResponseCache.install(httpCacheDir, httpCacheSize); // Library that implements HttpResponseCache for pre-ICS phones
} catch(Exception e){
}
}
}
然而,即使对于ICS手机,也没有发生任何缓存命中,看起来缓存根本就没有做任何事情。如果我做错了什么或丢失了什么,你能告诉我吗?
答案 0 :(得分:1)
上述链接中的'update'方法是使用http线程池,https和http帖子的示例代码。所以,除了建议上面评论中的链接外,我还在android中使用它们。
更多代码(来自HttpConnectionPost类的runnable:
public void run() {
// Log.d(TAG, "run ENTRY instance" +entry.toString());
handler.sendMessage(Message.obtain(handler, HttpConnection.DID_START));
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 40 * 1000);
HttpConnectionParams.setSoTimeout(params, 20 * 1000);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
httpClient = new DefaultHttpClient(MyConnectionManager.getInstance(), params);
// HttpConnectionParams.setSoTimeout(httpClient.getParams(), 25000);
httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Authorization")) {
request.addHeader("Authorization", "OAuth " +ClientCustomSSL.getInstance().getToken());
}
}
});
try {
HttpResponse response = null;
switch (method) {
case POST:
HttpPost httpPost = new HttpPost(url);
if (data != null){
System.out.println(" post data not null ");
httpPost.setEntity(new StringEntity(data));
}
if (entry != null){
ContentProducer cp = new ContentProducer() {
public void writeTo(OutputStream outstream) throws IOException {
ExtensionProfile ep = new ExtensionProfile();
ep.addDeclarations(entry);
XmlWriter xmlWriter = new XmlWriter(new OutputStreamWriter(outstream, "UTF-8"));
entry.generate(xmlWriter, ep);
xmlWriter.flush();
}
};
httpPost.setEntity(new EntityTemplate(cp));
}
httpPost.addHeader("GData-Version", "2");
httpPost.addHeader("X-HTTP-Method-Override", "PATCH");
httpPost.addHeader("If-Match", "*");
httpPost.addHeader("Content-Type", "application/xml");
response = httpClient.execute(httpPost);
break;
}
if (method < BITMAP)
processEntity(response.getEntity());
} catch (Exception e) {
handler.sendMessage(Message.obtain(handler,
HttpConnection.DID_ERROR, e));
}
MyConnectionManager.getInstance().didComplete(this);
}