2011-10-19 24 views

Respuesta

87

declarar su AsyncTask en su actividad:

private YourAsyncTask mTask; 

instanciarlo así:

mTask = new YourAsyncTask().execute(); 

eliminados/cancelar esta manera:

mTask.cancel(true); 
+2

después de utilizar de esta manera YourAsynchTask mTask = new YourAsncTask(); mTask.execute(); trabajó. bonito. – Senthil

+3

Aunque es un tanto molesto, no se puede cancelar realmente si se realiza una sola operación (como una consulta de base de datos) por ejemplo. Si la consulta lleva mucho tiempo y es solo una llamada, parece que no hay forma de cancelarla:/ – AgentKnopf

+0

Si está haciendo algo dentro de AsyncTask (en un bucle), entonces es posible que desee comprobar isCancelled() - consulte https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar

21

La razón por la que las cosas no se detienen es porque el proceso (doInBackground()) se ejecuta hasta que finaliza. Por lo tanto usted debe comprobar si el hilo se cancela o no antes de hacer las cosas:

if(!isCancelled()){ 
// Do your stuff 
} 

Así que, básicamente, si el hilo no se cancela, hacerlo, de lo contrario saltar :) podría ser útil para comprobar si esto algunas veces durante su operación, especialmente antes de tomar el tiempo.

también podría ser útil para "limpiar" un poco en

onCancelled(); 

Documentación para AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

Espero que esto ayude!

+0

si pasa true como parámetro, entonces se detendrá en la tarea de fondo, así que esto solo sería útil si pasa falso a 'task.cancel (boolean)' –

1

Tuve un problema similar: básicamente obtenía un NPE en una tarea asíncrona después de que el usuario destruyera el fragmento. Después de investigar el problema de desbordamiento de pila, adopté la siguiente solución:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

Entonces, puedo comprobar "si se ejecuta" periódicamente en mi código asíncrono. He puesto a prueba esto y ahora no puedo "romper" mi actividad. Esto funciona perfectamente y tiene la ventaja de ser más simple que algunas de las soluciones que he visto en SO.

6

No puede simplemente matar asynctask inmediatamente. Con el fin de que se detenga primero debe cancelarlo:

task.cancel(true); 

y que en doInBackground de AsyncTask() cheque método si ya está cancelada:

isCancelled() 

y si lo es, dejan de ejecutarse manualmente .

-4

u puede comprobar onCancelled() una vez y luego:

objeto protegido doInBackground (Objeto ...x) {

while (/* condition */) { 
    if (isCancelled()) break; 
} 
return null; 

}

+0

No se trata de cancelar AsyncTask desde otro hilo. – QMaster

9

Usted también puede tener que usarlo en o onDestroy de Activity del Ciclo de Vida:

//you may call the cancel() method but if it is not handled in doInBackground() method 
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED) 
    loginTask.cancel(true); 

donde loginTask es objeto de su agradecimiento AsyncTask

tú.

+0

¡Vine aquí exactamente para esto! – winklerrr