Dengan mengacu pada jawaban Yanchenko pada 29 April '10: Menggunakan pendekatan 'while (running)' adalah hal yang rapi ketika kode Anda di bawah 'doInBackground' harus dijalankan beberapa kali selama setiap eksekusi AsyncTask. Jika kode Anda di bawah 'doInBackground' harus dijalankan hanya sekali per eksekusi AsyncTask, menggabungkan semua kode Anda di bawah 'doInBackground' dalam loop 'while (running)' tidak akan menghentikan kode latar belakang (utas latar belakang) agar tidak berjalan ketika AsyncTask sendiri dibatalkan, karena kondisi 'while (running)' hanya akan dievaluasi setelah semua kode di dalam while loop telah dieksekusi setidaknya sekali. Karena itu, Anda harus (a.) Memecah kode Anda di bawah 'doInBackground' menjadi beberapa blok 'saat (menjalankan)' atau (b.) Melakukan banyak 'isCancelled'https://developer.android.com/reference/android/os/AsyncTask.html .
Untuk opsi (a.), Seseorang dapat mengubah jawaban Yanchenko sebagai berikut:
public class MyTask extends AsyncTask<Void, Void, Void> {
private volatile boolean running = true;
//...
@Override
protected void onCancelled() {
running = false;
}
@Override
protected Void doInBackground(Void... params) {
// does the hard work
while (running) {
// part 1 of the hard work
}
while (running) {
// part 2 of the hard work
}
// ...
while (running) {
// part x of the hard work
}
return null;
}
// ...
Untuk opsi (b.) Kode Anda di 'doInBackground' akan terlihat seperti ini:
public class MyTask extends AsyncTask<Void, Void, Void> {
//...
@Override
protected Void doInBackground(Void... params) {
// part 1 of the hard work
// ...
if (isCancelled()) {return null;}
// part 2 of the hard work
// ...
if (isCancelled()) {return null;}
// ...
// part x of the hard work
// ...
if (isCancelled()) {return null;}
}
// ...