HttpURLConnection似乎没有在Android上使用缓存

时间:2012-05-23 20:16:56

标签: android httpclient network-protocols httpresponse httpurlconnection

我最近将我的应用从使用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手机,也没有发生任何缓存命中,看起来缓存根本就没有做任何事情。如果我做错了什么或丢失了什么,你能告诉我吗?

1 个答案:

答案 0 :(得分:1)

http://pastebin.com/i60a90wv

上述链接中的'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);
    }