Ответ 1
httpclient.getConnectionManager().shutdown();
Я использую AsyncTask
для инициализации AndroidHttpClient
и выполняю запрос POST в doInBackground()
. Я хочу, чтобы пользователь мог отменить запрос, нажав кнопку "Назад". AsyncTask
имеет метод cancel()
, который только изменяет логическое возвращаемое значение isCancelled()
, а затем ждет завершения doInBackground()
до вызова onCancelled()
. Это означает, что AsyncTask
возвращает его к методу doInBackground()
, чтобы постоянно проверять отмену задачи (используя isCancelled()
). Если он был отменен, doInBackground()
должен вернуться преждевременно. Проблема, с которой я сталкиваюсь, заключается в том, что 99% выполнения рабочего потока в doInBackground()
останавливается:
HttpResponse response = httpClient.execute(request[0]);
поскольку этот вызов синхронной функции инкапсулирует сетевые аспекты запроса. Как я могу отменить запрос на полпути через?
Я рассматриваю попытку изменить время ожидания во время запроса, но это кажется небезопасным.
Я также рассматриваю возможность переопределения метода AsyncTask
cancel()
, который может работать лучше.
Любые предложения?
httpclient.getConnectionManager().shutdown();
Правильный способ прервать запрос с помощью 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()
не делает ничего, чтобы остановить выполняемый в настоящее время запрос, но я не исследовал его глубоко, чтобы попытаться выяснить, почему.
Вызвать HttpPost
или HttpGet
abort()
. Вы можете прервать запрос, который выдает исключение (я забываю, какое именно). Если вы используете ClientConnectionManager
, вам нужно установить System.setProperty("http.keepAlive", "false")
, иначе последующие запросы будут просто зависать. До сих пор существует проблема связи с подключением до версии 4.1.1.
На самом деле AsyncTask.cancel(boolean interruptIfRunning)
можно вызвать с помощью true
в качестве параметра для завершения потока.