Подтвердить что ты не робот

Как отменить HTTP-запрос на Android?

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

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

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

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

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

Любые предложения?

4b9b3361

Ответ 1

httpclient.getConnectionManager().shutdown();

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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