Отмена Http-соединения в Android - PullRequest
       0

Отмена Http-соединения в Android

16 голосов
/ 03 сентября 2011

Я использую org.apache.http, и у меня есть этот код:

DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);

HttpResponse resp = client.execute(get);
HttpEntity entity = resp.getEntity();

InputStream input = entity.getContent();

...
//Read the bytes from input stream

Это код, который я использую для загрузки файлов через Http, я хочу отменить соединение (может быть, пользователь выбирает) Какой изящный способ закрыть соединение.Я нашел 2 способа, оба отменяют загрузку.

  1. Закрытие входов стерам, input.close ();которое вызывает IOException.
  2. Прерывая объект HttpGet, get.abort () вызывает SocketException.

У меня есть попытка catch, поэтому нет ошибок, но без выдачи исключения есть способотменить или прервать соединение?

Как правильно это сделать?

Ответы [ 4 ]

3 голосов
/ 13 сентября 2012

Правильный способ сделать это - отправить значение FIN на сторону сервера.

Как бы то ни было, в Android у вас нет возможности участвовать в этом уровне, так что вы можете реализовать самостоятельно, используя C, или использовать один из методов, которые вы упомянули в своем вопросе.

3 голосов
/ 16 сентября 2012

Использование HttpUriRequest#about - правильный путь, на мой взгляд.Это приведет к немедленному завершению основного соединения и его исключению из пула соединений.Более новые версии HttpClient (4.2 и новее) перехватывают исключения SocketException, вызванные преждевременным завершением запроса пользователем.Проблема в том, что Google поставляет форк HttpClient на основе крайне устаревшей версии (pre-beta1).Если вы не можете или не хотите использовать более новую версию HttpClient, ваш единственный вариант - перехватить и исключить SocketException в вашем коде.

2 голосов
/ 19 сентября 2012

Попробуйте отменить задачу, если вы хотите прервать соединение: task.cancel(true); Это отменит задачу и запущенные в ней потоки.Проверьте это для справки: public final boolean cancel (boolean mayInterruptIfRunning)

Since: API Level 3 Пытается отменить выполнение этой задачи.Эта попытка потерпит неудачу, если задача уже выполнена, отменена или не может быть отменена по какой-либо другой причине.Если успешно, и эта задача не была запущена при вызове отмены, эта задача никогда не должна выполняться.Если задача уже запущена, параметр mayInterruptIfRunning определяет, следует ли прерывать поток, выполняющий эту задачу, при попытке остановить задачу.

В результате вызова этого метода будет вызываться onCancelled (Object) в пользовательском интерфейсепоток после doInBackground (Object []) возвращает.Вызов этого метода гарантирует, что onPostExecute (Object) никогда не вызывается.После вызова этого метода вы должны периодически проверять значение, возвращаемое isCancelled () из doInBackground (Object []), чтобы завершить задачу как можно раньше.

Параметры mayInterruptIfRunning true, если поток, выполняющий эту задачу, должен быть прерван;в противном случае выполняемые задачи могут быть выполнены.Возвращает false, если задача не может быть отменена, как правило, потому что она уже выполнена нормально;в противном случае

2 голосов
/ 13 сентября 2012

Используйте это

client.getConnectionManager().closeExpiredConnections();
client.getConnectionManager().shutdown();

Теперь вы можете решить, куда бы вы хотели написать эти 2 строки в коде. Он закроет соединение, используя созданный вами объект DefaultHttpClient.

Дайте мне знать, если это поможет вам.

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