2010-11-08 23 views
3

Bonjour, j'ai une AsyncTask dans mon application appelée OnCreate() qui récupère des données sur le web et affiche une barre de progression indéterminée pendant le téléchargement. Le problème est que lorsque je démarre l'application, l'écran reste vide jusqu'à la fin de la tâche asynchrone. Le code est quelque chose comme ça.Android AsyncTask et

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    loadData(); 
    //Several UI Code 
    startAsyncTasks(); 
} 


private void startAsyncTasks(){ 
    new ConnectingTask().execute(); 
} 
+0

Donc, si vous commentez la ligne startAsyncTasks(), l'interface utilisateur semble beaucoup plus rapide? –

+2

Cela vaut probablement la peine de poster le code de votre AsyncTask car le problème pourrait être là. –

+0

Assurez-vous de faire tout votre réseau (long terme) à l'intérieur de ConnectingTask.doInBackGround(). Cela devrait garantir que le thème principal de l'interface utilisateur ne sera pas bloqué pendant un travail lourd, il sera donc capable d'afficher les éléments de l'interface utilisateur de l'activité. –

Répondre

1

OnCreate() est exécutée avant que l'activité est affiché à l'écran, de sorte que l'ensemble du processus de téléchargement de données exécute avant de montrer l'activité.

La solution peut être de démarrer AsyncTask dans la méthode OnStart() au lieu de dans OnCreate() (également redéfini). OnStart() est exécuté alors que l'activité va s'afficher à l'écran (voir le cycle de vie de l'activité).

C'est le cas que j'ai implémenté dans mon application et cela fonctionne. Vous devriez montrer une boîte de dialogue de progression dans la méthode OnStart(), et la mettre à jour et l'ignorer dans AsyncTask dans les moments appropriés.

C'est à quoi il ressemble dans mon application:

  1. AsyncTask est démarré en activité OnStart() avec montrant boîte de dialogue
  2. Les données sont en cours de téléchargement dans la classe interne s'étendant AsyncTask
  3. Une fois les données téléchargé la boîte de dialogue est fermée et plus de traitement des données initialisé (OnPostExecute())

L'inconvénient pourrait être que OnStart() est appelé sur le premier appel d'activité, mais aussi après la restauration (par exemple après avoir minimisé l'application). AsyncTask peut donc être exécuté plusieurs fois à l'inverse de OnCreate(), qui est appelé une seule fois - quand l'activité est créée (pas quand elle est restaurée).

Il peut aussi y avoir des problèmes si vous faites le test JUnit de cette activité avec un dialogue dans AsyncTask - laissez-moi savoir si vous faites - afficherez une solution