使HttpDefaultClient的execute()非常慢

时间:2011-12-20 10:20:53

标签: android http client

我在HttpDefaultClient的execute()方法的execute方法中遇到了大量的性能问题。

我目前正在使用它将数据发布到服务器,接收JSON并反序列化数据。我的手机通话需要8到30秒。如果我切换到Wifi(它的速度非常快,同样的呼叫在我的电脑上需要300毫秒),需要3s到8s。至少有90%的时间花在执行方法上。

使用此代码:

    HttpPost post = new HttpPost(DEST_URL);
    HashMap<String, String> params = req.getPostParams();
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    for (String key : params.keySet()) {
        nameValuePairs.add(new BasicNameValuePair(key, params.get(key)));
    }

    post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    post.setHeader(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    HttpResponse response = httpClient.execute(post); // very slow!

    return response;

我们还开发了一款iOS应用程序,能够在1到2秒内完成相同的操作。是否有更快的方式http(将来的https)?

像这样创建客户端:

        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
        final SSLSocketFactory socketFactory = SSLSocketFactory
                .getSocketFactory();
        socketFactory
                .setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", socketFactory, 443));
        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        HttpClient client = new DefaultHttpClient(params);

使用:HTC Wildfire,Android 2.2.1

1 个答案:

答案 0 :(得分:0)

上面的

代码工作正常。

如果我按以下方式创建httpclient:

        DefaultHttpClient httpClient = new DefaultHttpClient();
    // httpclient
    httpClient.getParams().setParameter(
            CoreConnectionPNames.CONNECTION_TIMEOUT, mConnectionTimeOut);
    httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
            mSocketTimeOut);

第一次将数据发布到服务器并得到响应,它花了我10到20秒。

但是如果我按照上面的答案创建一个HttpClient。    当第一次将数据发布到服务器并得到响应时,它只需4秒,我认为它工作正常。