Android AsyncTask блокирует возврат ключа события - PullRequest
0 голосов
/ 17 мая 2011

Проблема:

Моя активность запускает AsyncTask в onStart ().В методе doInBackground я делаю короткий веб-запрос, и в зависимости от вашего сетевого подключения это может занять немного времени, поэтому я хочу, чтобы эта задача была отменена ...

НО ..

После нескольких часов работыПоиск, тестирование и отладку Я заметил, что когда пользователь нажимает кнопку «Назад» во время метода doInBackground, Keyevent ist всегда отправляется ПОСЛЕ того, как мой метод doInBackground завершен.

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

Так же и это нормальное поведениес asynctask и backbutton?

Это не может быть нормально, потому что как пользователь должен когда-либо возвращаться из активности на медленном соединении?

ждать истечения времени ожидания?

Я прошу помощи, отмена асинхронного веб-запроса ДОЛЖНА быть возможна:)

Ответы [ 2 ]

1 голос
/ 17 мая 2011

когда пользователь нажимает кнопку «Назад» во время метода doInBackground, Keyevent всегда отправляется ПОСЛЕ того, как мой метод doInBackground завершается.

Нет, это не так.

Если я нажму кнопку НАЗАД на моем устройстве, когда AsyncTask запущен в моей основной операции (загрузка файлов с моего сервера), действие будет немедленно закрыто.

Что верно, однако, это AsyncTaskпродолжит выполнение любого кода в методе doInBackground(), ЕСЛИ Я не отменил его явно (но вы уже знаете об этом).

Насколько я могу судить, ваш «веб-запрос» (что бы это ни было) блокирует ваш doInBackground() метод, и поэтому любая попытка отменить его в onPause(), onStop, onDestroy() и т. д. никогда не будет работать.

Как указывает преимущество, способ AsyncTask.cancel(...) метод работает так, что isCancelled устанавливается в значение «истина».Чтобы успешно отменить метод AsyncTask doInBackground(), необходимо периодически проверять isCancelled.Пример ...

@Override
protected Void doInBackground(String... params) {

    while (!isCancelled) {
        DoSomething();
    }
}

Проблема в том, что если DoSomething() (например, ваш 'webrequest') блокирует цикл while, то isCancelled не будет проверяться до его завершения.

0 голосов
/ 17 мая 2011

Это ожидаемое поведение.Документация гласит:

Отмена задачи

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

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