Quiero detener un hilo AsyncTask
de otro hilo AsyncTask
. He intentado como new AsyncTask.cancel(true)
para detener el proceso de fondo pero no se detuvo.Cómo detener el hilo asynctask en android?
¿Alguien podría ayudarme en esto?
Quiero detener un hilo AsyncTask
de otro hilo AsyncTask
. He intentado como new AsyncTask.cancel(true)
para detener el proceso de fondo pero no se detuvo.Cómo detener el hilo asynctask en android?
¿Alguien podría ayudarme en esto?
declarar su AsyncTask en su actividad:
private YourAsyncTask mTask;
instanciarlo así:
mTask = new YourAsyncTask().execute();
eliminados/cancelar esta manera:
mTask.cancel(true);
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!
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)' –
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.
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 .
u puede comprobar onCancelled() una vez y luego:
objeto protegido doInBackground (Objeto ...x) {
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}
No se trata de cancelar AsyncTask desde otro hilo. – QMaster
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ú.
¡Vine aquí exactamente para esto! – winklerrr
después de utilizar de esta manera YourAsynchTask mTask = new YourAsncTask(); mTask.execute(); trabajó. bonito. – Senthil
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
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