2011-06-19 9 views
5

Je fais actuellement quelque chose comme ça dans la méthode onPostExecute de AsyncTask, où NewTask est pas la tâche en cours qui est l'exécution:Android AsyncTask À partir Une autre AsyncTask

private class OlderTask extends AsyncTask<String, Void, Integer> { 
    //other functions (not important) 

    @Override 
    protected void onPostExecute(Integer result) { 
     new NewTask().execute(null, null); 
    } 
} 

Je me demande si cela est une mauvaise idée. Cela va-t-il entraîner l'attente de la NewTask par GC pour la OlderTask? Y a-t-il d'autres problèmes possibles avec l'utilisation d'une telle approche?

Et si c'est un problème, comment puis-je le corriger?

Répondre

3

À moins que NewTask ne soit une classe interne non statique dans OlderTask, cela n'empêchera pas le GC de collecter OlderTask à moins que vous ne conserviez une référence à celui-ci d'une autre manière.

Mais même si GC attendra jusqu'à ce que NewTask soit fait, cela ne devrait pas être un gros problème sauf si vous enregistrez beaucoup de données dans OlderTask ou créez beaucoup de copies de OlderTask. Donc, si votre conception l'exige, c'est OK. Mais il est certainement plus propre de ne pas avoir de tâches enchaînées.

+0

Merci. La même logique s'appliquerait-elle si 'OlderTask' crée une nouvelle' OlderTask'? – yydl

+0

Tant que c'est une instance différente de 'OlderTask' et qu'elle ne fait pas référence à l'instance précédente directement ou indirectement. –

0

J'utilise une méthode de rappel, Donc, quand le résultat arrive à onPostExecute j'appelle une autre AsynkTask de l'interface utilisateur, je pense que c'est une bonne idée, laissez-moi savoir ce que vous en pensez.

public class PatientSearchController extends AsyncTask < String, Void, String > { 

    private PatientSearchResultHandler handler = null; 

    public void onResultHandler(PatientSearchResultHandler handler) { 
     this.handler = handler; 
    } 

    @Override 
    protected String doInBackground(String...params) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     this.handler.onResultSuccessHandler(result); 
    } 
}