Yanchenko'nun 29 Nisan '10'daki cevabına referansla: 'doInBackground' altındaki kodunuzun AsyncTask'ın her yürütülmesi sırasında birden çok kez çalıştırılması gerektiğinde 'while (koşarken)' yaklaşımını kullanmak düzgündür. 'DoInBackground' altındaki kodunuz, AsyncTask'ın her yürütülmesi için yalnızca bir kez yürütülmesi gerekiyorsa, tüm kodunuzu 'doInBackground' altında bir 'while (çalışırken)' döngüsüne sarmak arka plan kodunun (arka plan iş parçacığı) çalışmasını durdurmaz. AsyncTask'ın kendisi iptal edildi, çünkü 'while (çalışırken)' koşulu yalnızca while döngüsünün içindeki tüm kod en az bir kez çalıştırıldığında değerlendirilecektir. Bu nedenle ya (a.) 'DoInBackground' altındaki kodunuzu birden çok 'while (çalışırken)' bloğuna bölmeli veya (b.) Çok sayıda 'isCancelled' gerçekleştirmelisinizhttps://developer.android.com/reference/android/os/AsyncTask.html .
Seçenek (a.) İçin, Yanchenko'nun cevabı şu şekilde değiştirilebilir:
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;
}
// ...
Seçenek (b.) İçin 'doInBackground'daki kodunuz şuna benzer:
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;}
}
// ...