web-dev-qa-db-fra.com

Comment arrêter le thread asynctask dans Android?

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?

54
user

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);
103
Yashwanth Kumar

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!

20
DecodeGnome

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);

loginTask est l'objet de votre AsyncTask

Merci.

12

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.

6
user2758776

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.

1
IanB