Je veux arrêter un thread AsyncTask
à partir d'un autre thread AsyncTask
. J'ai essayé comme new AsyncTask.cancel(true)
d'arrêter le processus d'arrière-plan mais cela ne s'est pas arrêté.
Quelqu'un pourrait-il m'aider à ce sujet?
déclarez votre tâche async dans votre activité:
private YourAsyncTask mTask;
instancier le comme ceci:
mTask = new YourAsyncTask().execute();
tuer/annuler comme ça:
mTask.cancel(true);
La raison pour laquelle les choses ne s'arrêtent pas pour vous est que le processus (doInBackground ()) s'exécute jusqu'à ce qu'il soit terminé. Par conséquent, vous devriez vérifier si le fil est annulé ou pas avant de faire des choses:
if(!isCancelled()){
// Do your stuff
}
Donc, fondamentalement, si le fil n'est pas annulé, faites-le, sinon ignorez-le :) Peut-être utile de vérifier cela quelques fois pendant votre opération, en particulier avant de prendre du temps.
En outre, il pourrait être utile de "nettoyer" un peu
onCancelled();
Documentation pour AsyncTask:
http://developer.Android.com/reference/Android/os/AsyncTask.html
J'espère que cela t'aides!
Vous devrez peut-être aussi l'utiliser dans onPause
ou onDestroy
de Activity
Cycle de vie:
//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);
où loginTask
est l'objet de votre AsyncTask
Merci.
Vous ne pouvez pas simplement tuer asynctask immédiatement. Afin de vous arrêter, vous devez d'abord l'annuler:
task.cancel(true);
et que dans la méthode doInBackground () du asynctask, vérifiez si elle est déjà annulée:
isCancelled()
et si c'est le cas, arrêtez de l'exécuter manuellement.
J'ai eu un problème similaire - en gros, je recevais un NPE dans une tâche asynchrone après que l'utilisateur ait détruit le fragment. Après avoir étudié le problème du débordement de pile, j'ai adopté la solution suivante:
volatile boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
running=true;
...
}
public void onDestroy() {
super.onDestroy();
running=false;
...
}
Ensuite, je vérifie "si je cours" périodiquement dans mon code asynchrone. J'ai déjà testé cela et je suis maintenant incapable de "casser" mon activité. Cela fonctionne parfaitement et a l'avantage d'être plus simple que certaines des solutions que j'ai vues sur SO.