58 votes

Comment arrêter le fil Asynctask dans Android?

Je veux arrêter un thread AsyncTask 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?

108voto

Yashwanth Kumar Points 12122
 private YourAsyncTask mTask;
 

déclarez votre tâche async dans votre activité.

 mTask = new YourAsyncTask().execute();
 

instancier comme ça.

 mTask.cancel(true);
 

tuer / annuler comme ça.

21voto

DecodeGnome Points 966

La raison pourquoi les choses ne s'arrête pas pour vous, c'est parce 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 trucs:

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

Donc en gros, si le fil n'est pas annulé, il, sinon l'ignorer :) Il pourrait être utile de vérifier quelques fois lors de votre opération, en particulier avant le temps de prendre des trucs.

En outre, il pourrait être utile de le "nettoyer" alittle en

onCancelled();

Documentation pour AsyncTask:

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

Espérons que cette aide!

6voto

user2758776 Points 128

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 () de asynctask , vérifiez si elle est déjà annulée:

 isCancelled()
 

et si c'est le cas, arrêtez de l'exécuter manuellement.

1voto

IanB Points 2051

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X