2012-07-06 4 views
0

J'ai une activité qui héberge des fragments. appuyer sur un bouton va du fragment A au fragment B en passant par un FragmentTransaction et l'ajout à la pile arrière. Maintenant, le fragment B a une implémentation AsyncTask qui charge les images d'une carte SD et la publie au fur et à mesure du chargement d'une image. Si j'appuie sur le bouton Retour, mon application se bloque. . Le rapport d'erreur indique que la tâche asynchrone est le problème car il était encore en chargement lorsque le bouton Précédent a été pressé, alors ma question est, comment puis-je arrêter la tâche asynchrone lorsque le bouton Précédent a été pressé pour retourner au précédent fragment/activité? .. Merci.Stop AsyncTask in Fragments lorsque le bouton Précédent est enfoncé

Répondre

12

Remplacer la onStop() de votre fragment et faire:

protected void onStop() { 
    super.onStop(); 

    //check the state of the task 
    if(task != null && task.getStatus() == Status.RUNNING) 
     task.cancel(true); 
} 
+0

-vous dire sur le fragment contenant le AsyncTask droit? .. Eh oui, – irobotxxx

+0

le fragment .. Merci – Nermeen

+0

ça marche! – irobotxxx

2

Il suffit d'appeler ce code dans le onBackPressed() -method de votre activité d'hébergement - même pour un fragment via onDestroy():

if(myFancyAsyncTask != null && myFancyAsyncTask.getStatus() == Status.RUNNING) { 
    myFancyAsyncTask.cancel(true); 
} 

Cela annulera une asyncTask en cours d'exécution pour vous. Assurez-vous de vérifier en l'AsyncTask si elle n'a pas été annulé en utilisant le cycle de vie des méthodes:

protected void onPostExecute(Long result) { 
    if(!isCancelled()) { 
     // do your work 
    } 
} 
2

Je vous conseille fortement de voir this cycle de vie du fragment pour éviter les confusions futures. Et dans votre cas, je pense que vous devez remplacer la méthode onPause pour terminer la asyncTask.

@Override 
protected void onPause() { 
    super.onPause(); 
    //check the state of the task 
    if(task != null && task.getStatus() == Status.RUNNING) 
     task.cancel(true); 
} 
1
AsyncTaskRunner doAsynchronousTask; //Before onCreateView 

//in onCreateView() 
    doAsynchronousTask = new AsyncTaskRunner();`` 
    doAsynchronousTask.execute(); 


// after onCreateView() 
    @Override 
    public void onStop() { 
     super.onStop(); 
     doAsynchronousTask.cancel(true); 
    } 
+0

Je pense que ce serait mieux si vous ajoutez une explication à votre réponse afin qu'elle soit plus facile à comprendre. – Keale

+0

Déclare la méthode AsyncTask globalement. exécutez cette tâche asynchrone dans votre méthode oncreatview() ou onActivityCreated(). Enfin, copiez simplement la méthode onStop() –

2

Annulation du AsyncTask dans onStop() n'est pas un très bon choix, car il peut arrêter le AsyncTask dans les scénarios où vous voulez qu'il continuer à courir. Imaginez que vous ayez un fragment/une activité où vous montrez plusieurs images téléchargées sur le net et si vous appuyez sur une image, vous êtes censé amener l'utilisateur à une autre application spécifique à l'image. Cela ferait en sorte que votre fragment apparaisse surStop() et annulera votre AsyncTask même s'il reste des images que vous souhaitez télécharger lorsque l'utilisateur revient à l'activité. Je pense que le faire dans onDestroy() est un meilleur choix.

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    if(doTask != null){ 
     doTask.cancel(true); 
    } 
} 
Questions connexes