Сделайте execute () HttpDefaultClient очень медленным - PullRequest
3 голосов
/ 20 декабря 2011

У меня огромные проблемы с производительностью с методом execute метода execute () объекта HttpDefaultClient.

В настоящее время я использую это для отправки данных на сервер, получения JSON и десериализации данных.Звонок на моем телефоне занимает от 8 до 30 секунд.Если я переключаюсь на Wi-Fi (это довольно быстро, тот же вызов занимает 300 мс на моем ПК), это занимает от 3 до 8 с.По крайней мере 90% этого времени тратится в методе execute.

Использует ли этот код:

    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 до2s.Есть ли более быстрый способ для 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 голосов
/ 08 августа 2013

коды выше работает отлично.

если я создаю httpclient следующим образом:

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

Впервые разместить данные на сервере и получить ответ, это стоило мне 10-20 секунд.

но если я создам HttpClient, следуя ответу выше. когда первый раз отправлял данные на сервер и получал ответ, это стоило всего 4 секунды, и я думаю, что оно отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...