Apache HttpClient 4.0 не может выполнить тайм-аут для сокета на Android - PullRequest
6 голосов
/ 23 августа 2011

Я работаю над приложением Android, которое требует использования HttpClient для загрузки файла с устройства Android на веб-сервер.Файл, который я загружаю, может достигать размеров до 1 Гб, поэтому могут возникнуть тайм-ауты, если устройство теряет соединение во время загрузки.Странно то, что тайм-аут, который я установил для сокета, похоже, не имеет никакого эффекта.Приложение будет зависать всякий раз, когда я теряю соединение, а не вызывать исключение SocketTimeoutException.

Я пытался использовать:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT);
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT);

, но это работало только на время ожидания соединения, а не на время сокета.Также я попытался:

HttpParams p = httpclient.getParams();
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);

Причина, по которой я знаю, что тайм-аут соединения работает, заключается в том, что я получил бы исключение для тайм-аута соединения после выполнения

httpclient.execute(httppost);

Приложение, кажется, зависает, когда соединениетеряется во время загрузки, но после того, как приложение успешно установило соединение с сервером.

Чтобы протестировать свое приложение, я в разное время отключал сеть, чтобы посмотреть, как приложение отреагирует.Если я отключаю сеть перед отправкой запроса, я получаю ошибку соединения, и мое приложение может корректно это обработать, но если я отключу ее во время загрузки, приложение зависает.Конечно, я делаю все эти запросы через AsyncTasks, поэтому основной поток пользовательского интерфейса не падает.Мне просто интересно, есть ли какой-нибудь другой способ убедиться, что сокет истечет, если я не получу никаких данных, или я что-то здесь упускаю.Я читал много блогов и постов, но большинство из них просто предлагают использовать SO_TIMEOUT, который у меня не работает.

sotimeout не работает в многочастном посте http на android 2.1

Ответы [ 2 ]

0 голосов
/ 19 декабря 2012

Я столкнулся с той же проблемой, что и вы, с тем же вариантом использования.Это происходит на Samsung Galaxy S2 под управлением Android 2.3.6, но не с тем же устройством на 4.x.К сожалению, это именно то устройство, которое использует мой клиент, и оно отлично работает примерно на 10 других тестовых устройствах с различными версиями и конструкторами Android ...

Я часами пытался использовать библиотеку HttpUrlConnection вместо HttpClient от Apache,но конечный результат тот же.AndroidHttpClient показывает то же поведение.Это заставляет меня сказать, что это звучит как аппаратная реализация или проблема, связанная с ОС ...

Единственный найденный мной обходной путь - это поместить метод HttpClient.execute() в отдельный поток и вызвать thread.join(timeout) в качестве защиты.чтобы остановить поток, если что-то пойдет не так.Недостатком является то, что когда загрузка идет нормально, но занимает больше времени, чем запрос, запрос прерывается ...

Если вы нашли что-то за это время, я был бы очень признателен, если бы вы могли поделиться им.

0 голосов
/ 23 августа 2011

Вы создаете свой собственный ClientConnectionManager? Взгляните на источник для AndroidHttpClient.newInstance () .

Они создают новый объект BasicHttpParams и передают его конструкторам как для ThreadSafeClientConnectionManager, так и для DefaultHttpClient. Я не вижу способа установить параметры в ClientConnectionManager, кроме как в конструкторе.

...