Существует два подхода к отмене AsyncTask
:
- Проверка
isCancelled
внутри вашего doInBackground
метода, чтобы попытаться завершиться как можно скорее. - Вызов
cancel(true)
, тогда фоновый поток AsyncTask
будет прерван.Чтобы это работало, вам нужно стратегически разместить Thread.sleep
вызовы в вашем методе doInBackground
, и когда вы поймаете InterruptedException
, вы вернетесь.
Из этих двух подходовпоследний является наиболее ненадежным, поскольку любой вызов метода, перехватывающего InterruptedException
, отличного от вашего, приведет к аннулированию отмены.Например, если вы вызываете метод, такой как SystemClock.sleep
, который поглощает исключение, вы никогда не попадете в условие catch.
В обоих случаях длинные операции между isCancelled
проверками или Thread.sleep
вызовами будут выполняться до конца.
Теперь по вашему вопросу вы использовали второй подход, но не было никакого вызова Thread.sleep
, поэтому он не будет работать, если только некоторые методы, которые вы вызываете, не перехватят исключение Interrupted и не сгенерируют исключение IOException.Вероятно, изменения в реализации от версии к другой имеют значение.