Com referência à resposta de Yanchenko em 29 de abril de '10: Usar uma abordagem 'while (running)' é legal quando seu código em 'doInBackground' precisa ser executado várias vezes durante cada execução da AsyncTask. Se o seu código em 'doInBackground' tiver que ser executado apenas uma vez por execução da AsyncTask, envolver todo o seu código em 'doInBackground' em um loop 'while (running)' não interromperá a execução do código de segundo plano (thread de segundo plano) quando o A própria AsyncTask é cancelada, porque a condição 'while (running)' só será avaliada depois que todo o código dentro do loop while tiver sido executado pelo menos uma vez. Você deve então (a.) Dividir seu código em 'doInBackground' em vários blocos 'while (running)' ou (b.) Executar vários 'isCancelled'https://developer.android.com/reference/android/os/AsyncTask.html .
Para a opção (a.), Pode-se modificar a resposta de Yanchenko da seguinte forma:
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;
}
// ...
Para a opção (b.), Seu código em 'doInBackground' será semelhante a este:
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;}
}
// ...