Мені не подобається змушувати переривати свої завдання з асинхронізацією без cancel(true)
зайвих зусиль, тому що у них можуть бути звільнені ресурси, такі як закриття сокетів або потоків файлів, запис даних у локальну базу даних тощо. З іншого боку, я стикався з ситуаціями, коли Завдання async відмовляється закінчити себе частиною часу, наприклад, іноді, коли основна діяльність закрита, і я прошу завдання async закінчити всередині onPause()
методу діяльності. Тож справа не в тому, щоб просто телефонувати running = false
. Мені потрібно прийняти змішане рішення: обидва дзвінки running = false
, потім давши завдання асинхронізації кілька мілісекунд, щоб закінчити, а потім зателефонувати cancel(false)
або cancel(true)
.
if (backgroundTask != null) {
backgroundTask.requestTermination();
try {
Thread.sleep((int)(0.5 * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
if (backgroundTask.getStatus() != AsyncTask.Status.FINISHED) {
backgroundTask.cancel(false);
}
backgroundTask = null;
}
Як побічний результат, після doInBackground()
закінчення, іноді onCancelled()
називають метод, а іноді onPostExecute()
. Але принаймні припинення завдання асинхронізації гарантоване.