2013-04-30 4 views
0

J'ai un Asynctask B qui est exécuté à partir de l'activité A. Lors de l'exécution postérieure de ce B, à une certaine condition B pourrait créer une nouvelle instance de lui-même et l'exécuter. Ce que j'ai fait est de mettre la déclaration AsyncTask comme globale à l'intérieur de la B et a substitué l'onCancelled de B pour annuler la nouvelle instance créée sur ontextextuel.Annuler AsyncTask qui n'exécute pas les appels onCancelled?

donc onDestroy de l'activité A b.cancel() annulera également la tâche asynchrone any exécutée sur PostExecute.

@Override 
    protected void onCancelled() 
    { 
     if(currentPlansAsync != null) 
     { 
     currentPlansAsync.cancel(true); 
     } 
     super.onCancelled(); 
    } 

Et nouvelle instance de currentPlansAsync est appelé onPostExecute comme suit:

private void processAfterFailure() 
    { 

     if(this.counter < 3) 
     { 
     ProgressDialog progressDialog = 
      GeneralUtils.showProgressDialog(parentActivity, parentActivity.getResources().getString(string.WaitDialogTitle), 
       parentActivity.getResources().getString(string.WaitDialogMessage)); 
     this.counter++; 
     currentPlansAsync = new CurrentPlansAsync(parentActivity, application, progressDialog, application.planBL, this.counter); 
     currentPlansAsync.execute(); 

     } 
     else 
     { 
     Toast.makeText(parentActivity, parentActivity.getResources().getString(string.SERVICE_ERROR), Toast.LENGTH_LONG).show(); 
     } 

    } 

Ma question est que si AsyncTask B a arrêté l'exécution et il a exécuté un autre AsyncTask C et l'activité A va à OnDestroy et B est annulé (b.cancel(true);) sera surCancelled qui est remplacé dans la classe B être appelé ??

Il en est ainsi j'assure que je résilie le AsyncTask qui a été exécuté à partir de l'activité et aussi la AsyncTask exécutée à partir de l'intérieur de cette AsyncTask

+0

Vous ne pouvez pas annuler une tâche une fois celle-ci terminée. Mais vous pouvez rendre la méthode 'onCancelled' publique et l'appeler à la place. – vorrtex

Répondre

3

onCancelled() est appelée immédiatement après les doInBackground() retours, si un cancel() L'appel a été effectué avant la fin du travail en arrière-plan. Il ne sera pas appelé si vous cancel() le AsyncTask après cela.

Je recommande de créer une méthode publique qui fera ce annulera toutes les tâches de l'enfant et appeler cette méthode publique:

public void cancelChildTasks() 
{ 
    if(currentPlansAsync != null) 
    { 
     currentPlansAsync.cancel(true); 
     currentPlansAsync.cancelChildTasks(); 
    } 
} 

Vous devriez toujours appeler et gérer la méthode cancel() des AsyncTask s pour pour arrêter l'exécution doInBackground() si elle est en cours d'exécution. Il suffit de traiter les tâches enfant dans les méthodes publiques au lieu de onCancelled().

Questions connexes