Как я могу отменить HTTP-запрос Android? - PullRequest
14 голосов
/ 21 августа 2011

Я использую AsyncTask, чтобы инициализировать AndroidHttpClient и выполнить запрос POST в doInBackground(). Я бы хотел, чтобы пользователь мог отменить запрос, нажав кнопку «Назад». AsyncTask имеет метод cancel(), который изменяет только логическое возвращаемое значение isCancelled(), а затем ожидает завершения doInBackground() перед вызовом onCancelled(). Это означает, что AsyncTask оставляет на усмотрение метода doInBackground() непрерывную проверку отмены задачи (используя isCancelled()). Если он был отменен, doInBackground() должен вернуться преждевременно. У меня проблема в том, что на 99% выполнение рабочего потока в doInBackground() останавливается на:

HttpResponse response = httpClient.execute(request[0]);

потому что этот синхронный вызов функции инкапсулирует сетевые аспекты запроса. Как я могу отменить запрос на полпути?

Я пытаюсь изменить время ожидания во время запроса, но это кажется небезопасным.

Я также рассматриваю возможность переопределения метода AsyncTask cancel(), который может работать лучше.

Есть предложения?

Ответы [ 4 ]

19 голосов
/ 14 ноября 2012

Правильный способ прервать запрос с помощью AndroidHttpClient API - это вызвать abort() для объекта запроса, который вы передаете в httpClient.execute(). Это приведет к тому, что вызов execute() вызовет IOException, а запрос isAborted() запроса начнет возвращать значение true. Вызов abort() определен в интерфейсе AbortableHttpRequest, который в основном реализуют все интересные классы запросов (HttpGet, HttpPost и т. Д.).

AsyncTask.cancel(true) не отменяет запрос, потому что AndroidHttpClient.execute() не блокирует таким образом, что Thread.interrupt() сделает все, чтобы остановить (поток не ожидает присоединения к другому потоку, ожидает мьютекса или спать). Thread.interrupt() НЕ прекращает блокировать ввод / вывод.

В моем тестировании вызов httpClient.close() или httpClient.getConnectionManager().shutdown() не сделал ничего, чтобы остановить выполняемый в данный момент запрос, но я не стал глубоко исследовать, чтобы выяснить, почему.

11 голосов
/ 05 сентября 2011
httpclient.getConnectionManager().shutdown();
2 голосов
/ 18 января 2013

Вызовите метод HttpPost или HttpGet * abort(). Вы можете прервать запрос, который выдает (я забыл, какой именно) исключение. Если вы используете ClientConnectionManager, вы захотите установить System.setProperty("http.keepAlive", "false"), в противном случае последующие запросы будут просто зависать. Проблема с сохранением соединения все еще существует вплоть до версии 4.1.1.

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

На самом деле AsyncTask.cancel(boolean interruptIfRunning) можно вызвать, используя true в качестве параметра для завершения потока.

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