2011-08-17 2 views
4

J'ai un petit problème avec AsyncTask.Tâche d'arrêt asynchrone lorsque le bouton de retour est enfoncé

je l'ai mis en œuvre comme suit

private class MakeConnection extends AsyncTask<String, Void, String> implements OnDismissListener{ 

    Context context; 
    ProgressDialog myDialog; 
    public MakeConnection(Context conetext) 
    { 
     this.context = conetext; 
     myDialog = new ProgressDialog(this.context); 
     myDialog.setCancelable(true); 
     myDialog.setOnDismissListener(this); 
    } 

    @Override 
    protected String doInBackground(String... urls) { 
     //do stuff 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
      myDialog.dismiss(); 
      success(result); 
     }catch(JSONException e) 
     { 
      data = e.toString(); 
     } 
    } 

    @Override 
     protected void onProgressUpdate(Void... values) { 
      myDialog = ProgressDialog.show(context, "Please wait...", "Loading the data", true); 
     } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 

     this.cancel(true); 
    } 
} 

Mais chaque fois que je presse le rien bouton de retour se produit, il effectue un peu la tâche comme si je ne pas appuyer sur le bouton de retour

Toute idée pourquoi ?

Répondre

12

Il y a deux parties de ce problème:

1) Mettre en oeuvre votre doInBackground() de telle manière, il vérifie si AsyncTask est annulée.

@Override 
protected String doInBackground(String... urls) { 
     for(int i = 0; i < 100 && !isCancelled(); i++) { 
      //do some stuff 
     } 
} 

2) Vous devriez appeler asynTask.cancel(true) dans votre onDestroy() de l'activité.

+0

J'ai une question à ce sujet maintenant, j'ai mis en œuvre comme vous le suggérez, mais ce que je veux savoir est dois-je capturer l'événement de bouton de retour dans le thread UI principal ou seulement dans la méthode AsyncTask onDesmiss? Parce que quand j'ai une connexion lente, je peux annuler le AsyncTask avec l'implémentation en cours – Armand

+0

Vous devriez annuler 'AsyncTask' dans' onDestroy() 'de Activity. Lorsque la tâche est annulée, 'onPostExecute()' ne sera pas appelé. Dans votre cas, la tâche va traîner pendant un certain temps, mais une fois terminée, 'AsyncTask.onCancelled()' est appelé (vous pouvez le remplacer, bien sûr). Vous devriez faire attention seulement dans cette fonction (ou simplement ne pas toucher l'interface utilisateur de 'onCancelled()'), car il peut être appelé après que l'activité soit déjà détruite. – inazaruk

+0

Ok, si je laisse l'activité ouverte pendant un certain temps et que l'écran se verrouille, puis déverrouille et recommence à l'utiliser, et essaye de démarrer une nouvelle activité avec un AsyncTask, ça ouvre ma boîte de dialogue et rien d'autre ne se passe. – Armand

4

Cela corrige mon problème

@Override 
protected void onPreExecute(){ 
    myDialog = ProgressDialog.show(
      context, 
      "Please wait...", 
      "Loading the data", 
      true, 
      true, 
      new DialogInterface.OnCancelListener(){ 
       @Override 
       public void onCancel(DialogInterface dialog) { 
        MakeConnection.this.cancel(true); 
       } 
      } 
    ); 
} 
1

il est également possible d'utiliser la méthode follwing de l'activité

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 
    imageLoadingAsyncTask.cancel(true); 
} 
Questions connexes