Выполнение HttpClient продолжает выдавать исключение ConnectTimeoutException

В моем приложении есть очень большая ошибка, которую я действительно не могу решить. Всякий раз, когда я делаю вызов для отдыха с помощью следующего кода:

  HttpGet request = new HttpGet(url + getParams());

  HttpParams httpParameters = new BasicHttpParams();
  HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
  HttpConnectionParams.setSoTimeout(httpParameters, 10000);

  DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);

  httpClient.execute(request);

Я получаю ошибку в DDMS:

07-15 11:22:47.448: WARN/System.err(973): org.apache.http.conn.ConnectTimeoutException: Connect to (some ip-address) timed out

Но иногда код работает идеально, и я получаю свои данные так, как должен. Я также протестировал вызов остального сервера через обычный веб-браузер на моем компьютере, и он всегда возвращает мои данные в течение 100 мс. Так что я делаю не так? Я также тестировал его на другом устройстве, но это вызывает у меня ту же проблему. Я был бы ТАК рад, если бы кто-нибудь мог решить мою проблему :)


person Martijn538    schedule 15.07.2011    source источник
comment
Вероятно, это связано с медленной сетью (вы используете Wi-Fi или 3G?). Попробуйте запустить его в эмуляторе. Возможно, вам потребуется увеличить время ожидания подключения и настроить механизм повтора.   -  person kgiannakakis    schedule 15.07.2011
comment
Да, но с другими моими приложениями я могу постоянно получать запрошенные данные. И с одним из телефонов я использую Wi-Fi, но и для этого есть исключения. И насколько я знаю, у httpclient есть механизм автоматического повтора?   -  person Martijn538    schedule 15.07.2011
comment
Увеличьте таймаут до 20-30 секунд. Иногда линия может быть занята и, следовательно, истекло время ожидания.   -  person Andrew Anderson    schedule 15.07.2011
comment
Хорошо, я увеличил время ожидания до 20 секунд: HttpConnectionParams.setConnectionTimeout (httpParameters, 20000); HttpConnectionParams.setSoTimeout (httpParameters, 20000); Но у меня все та же ситуация, данные загружаются очень редко и в основном ничего не получает   -  person Martijn538    schedule 15.07.2011
comment
Привет, Martijn538 Вы нашли решение проблемы с тайм-аутами?   -  person goodm    schedule 16.03.2012


Ответы (4)


Проблема в DefaultHttpClient. Вы используете его асинхронно? Поскольку DefaultHttpClient не является потокобезопасным, его использование в асинхронной среде может вызвать проблемы. У меня была эта проблема раньше, когда моя деятельность запускала несколько Http-соединений одновременно, и в итоге я изменил его на использование HttpURLConnection. Вы можете обратиться к этому сайту: http://www.vogella.de/articles/AndroidNetworking/article.html

person Steven Xiao Xu Pen    schedule 13.01.2012

У меня такая же проблема.

Попробуйте использовать прямой IP для ваших запросов. Я заметил, что поиск DNS в Android иногда ведет себя довольно странно. Я искал и нашел это: http://mailinglists.945824.n3.nabble.com/Android-and-reverse-DNS-lookup-issues-td3011461.html.

Не знаю, актуально это или нет, я все еще пытаюсь найти обходной путь. Может быть, кто-нибудь здесь сможет посмотреть и разобраться.

person ehanoc    schedule 05.08.2011
comment
Была такая же проблема после того, как я изменил свой файл hosts. Перезагрузка телефона решила проблему. - person Niels; 03.04.2012

Проверьте, можете ли вы подключиться с помощью компьютера для разработки, а также проверьте время загрузки. Очень велика вероятность, что ваши таймауты слишком малы.

person Ravi Vyas    schedule 15.07.2011
comment
Поменял таймауты на 20 секунд, все та же проблема .. Что еще можно попробовать? Никто раньше не сталкивался с этой проблемой? - person Martijn538; 15.07.2011
comment
Можете ли вы получить доступ к URL-адресу для просмотра вашей машины разработчика? - person Ravi Vyas; 15.07.2011
comment
Да, но проблема в том, что иногда он загружается хорошо и вовремя, а иногда кажется, что он не загружается вообще! - person Martijn538; 15.07.2011

Была аналогичная проблема, могла быть воспроизведена только при попытке подключения с использованием нескольких устройств одновременно, и решение было:

Перезагрузка инстанса решила проблему с подключениями. (или просто необходимо перезапустить сетевую службу)

(c) Администратор моего сервера / экземпляра

Кроме того, есть люди, которые сталкиваются с подобными проблемами, и некоторые другие решения сработали для них, например:

  1. Отключить tcp_timestamp
  2. Отключить tcp_tw_reuse и tcp_tw_recycle
  3. Включен режим сохранения виртуальной машины в манифесте Android: android: vmSafeMode = "true"

person GregoryK    schedule 29.10.2015