когда пользователь нажимает кнопку «Назад» во время метода 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
не будет проверяться до его завершения.