uso studio stop publishprogress oncancelled definicion cancel asynctask android android-asynctask

studio - oncancelled asynctask android



¿Cómo detener el hilo asynctask en Android? (6)

Quiero detener un subproceso AsyncTask de otro subproceso AsyncTask . He intentado como new AsyncTask.cancel(true) para detener el proceso de fondo pero no se detuvo.

¿Alguien podría ayudarme con esto?


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

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

Entonces, básicamente, si el hilo no se cancela, hazlo, de lo contrario omítalo :) Podría ser útil verificar esto algunas veces durante tu operación, especialmente antes de tomar algo.

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

onCancelled();

Documentación para AsyncTask:

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

¡Espero que esto ayude!


No puedes matar a asynctask inmediatamente. Para detenerlo, primero debe cancelarlo:

task.cancel(true);

y que en el método doInBackground () de asynctask compruebe si ya se ha cancelado:

isCancelled()

y si es así, deja de ejecutarlo manualmente.


También puede tener que usarlo en onPause o onDestroy of Activity Life Cycle:

//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 el objeto de su AsyncTask

Gracias.


Tuve un problema similar: esencialmente estaba obteniendo un NPE en una tarea asíncrona después de que el usuario destruyera el fragmento. Después de investigar el problema en , 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; ... }

Luego, compruebo "si se está ejecutando" 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.


Usted puede verificar OnCanceled () una vez y luego:

Objeto protegido doInBackground (Objeto ... x) {

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

}


declara tu asyncTask en tu actividad:

private YourAsyncTask mTask;

instanciarlo así:

mTask = new YourAsyncTask().execute();

matar / cancelar de esta manera:

mTask.cancel(true);