Con referencia a la respuesta de Yanchenko el 29 de abril de '10: Usar un enfoque 'while (running)' es bueno cuando su código bajo 'doInBackground' debe ejecutarse varias veces durante cada ejecución de AsyncTask. Si su código bajo 'doInBackground' tiene que ejecutarse solo una vez por ejecución de AsyncTask, envolver todo su código bajo 'doInBackground' en un ciclo 'while (running)' no detendrá la ejecución del código de fondo (subproceso de fondo) cuando el AsyncTask en sí se cancela, porque la condición 'while (en ejecución)' solo se evaluará una vez que todo el código dentro del ciclo while se haya ejecutado al menos una vez. Por lo tanto, debe (a.) Dividir su código en 'doInBackground' en múltiples bloques 'while (running)' o (b.) Realizar numerosos 'isCancelled'https://developer.android.com/reference/android/os/AsyncTask.html .
Para la opción (a.), Uno puede modificar la respuesta de Yanchenko de la siguiente manera:
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 la opción (b.), Su código en 'doInBackground' se verá así:
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;}
}
// ...