Отмена подключения Http в android
Я использую 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 способа, Оба отменяет загрузку.
- Закрытие inputsteram, input.close(); что вызывает IOException.
- Отменить объект HttpGet, get.abort() вызывает SocketException.
У меня есть попытка поймать, поэтому нет erros, но без исключения исключения,
есть способ отменить или прервать соединение?
Каков правильный путь?
Ответы
Ответ 1
Правильный способ сделать это - отправить FIN
значение на стороне сервера.
Как всегда в android у вас нет возможности участвовать в этом уровне, поэтому вы можете реализовать себя с помощью C или использовать один из методов, которые вы упомянули в своем вопросе.
Ответ 2
Использование HttpUriRequest#about
- правильный путь, на мой взгляд. Это приведет к немедленному прекращению базового соединения и его выселению из пула соединений. Новые версии HttpClient (4.2 и новее) перехватывают SocketExceptions, вызванные преждевременным прерыванием запроса пользователем. Проблема в том, что Google отправляет вилку HttpClient на основе крайне устаревшей версии (pre-beta1). Если вы не можете или хотите использовать более новую версию HttpClient, ваш единственный вариант - уловить и удалить SocketException в вашем коде.
Ответ 3
Используйте этот
client.getConnectionManager().closeExpiredConnections();
client.getConnectionManager().shutdown();
Теперь вы можете решить, где бы вы хотели написать эти 2 строки в коде. Он закроет соединение, используя созданный вами объект DefaultHttpClient.
Сообщите мне, если это вам поможет.
Ответ 4
Попробуйте отменить задачу, если вы хотите прервать соединение: task.cancel(true);
Это отменит задачу и потоки, запущенные в ней.
Проверьте это для справки:
public final boolean cancel (boolean mayInterruptIfRunning)
С: API уровня 3
Попытка отменить выполнение этой задачи. Эта попытка потерпит неудачу, если задача уже завершена, уже отменена или не может быть отменена по какой-либо другой причине. В случае успеха, и эта задача не началась при вызове отмены, эта задача никогда не должна запускаться. Если задача уже запущена, параметр mayInterruptIfRunning определяет, должен ли поток, выполняющий эту задачу, прерваться при попытке остановить задачу.
Вызов этого метода приведет к тому, что onCancelled (Object) будет вызываться в потоке пользовательского интерфейса после возвращения doInBackground (Object []). Вызов этого метода гарантирует, что onPostExecute (Object) никогда не вызывается. После вызова этого метода вы должны периодически проверять значение, возвращаемое isCancelled(), из doInBackground (Object []), чтобы закончить задачу как можно раньше.
Параметры
mayInterruptIfRunning true, если поток, выполняющий эту задачу, должен быть прерван; в противном случае выполнение выполненных задач может быть завершено.
Возвращает
false, если задача не может быть отменена, как правило, потому что она уже завершена нормально; true иначе