2010-10-23 24 views
1

J'ai une TabActivity implémentant TabContentFactory, qui démarre une AsyncTask dans onCreate() pour aller chercher les données pour les onglets. Lorsque la tâche AsyncTask est terminée, onPostExecute() peut directement mettre à jour les éléments de l'interface utilisateur, n'est-ce pas? Ce qui signifie, puisque cette méthode s'exécute dans l'UI-Thread aucune autre synchronisation de thread serait nécessaire lors de l'accès aux éléments d'interface utilisateur? De toute façon, le problème que j'ai, c'est que mon UI-Thread appelle createTabContent() dans le TabActivity alors que la AsyncTask est encore occupée. Je dois ajouter au moins un onglet ou obtenir une exception NullPointerException. Mais comment puis-je ajouter des onglets uniquement lorsque ma tâche asynchrone est terminée et que le fichier ProgressDialog a été supprimé?Android: TabActivity - n'ajoute aucun onglet avant la fin de la tâche AsyncTask

Je serais heureux si quelqu'un pourrait aider ...

Répondre

1
When the AsyncTask has finished, onPostExecute() could directly update the 
UI-elements, right? Meaning, since that method runs in the UI-Thread no further 
thread-synchronization would be required when accessing UI-elements? 

droit.

Anyway, the problem I have is that my UI-Thread calls createTabContent() in the 
TabActivity while the AsyncTask is still busy. 

Si vous avez besoin de mettre à jour l'interface utilisateur en AsyncTask est toujours en cours en arrière-plan, puis passer outre AsyncTask.onProgressUpdate (..) puis appelez AsyncTask.publishProgress (..) à partir du AsyncTask.doInBackground (..) .

I have to add at least one tab, or I get a NullPointerException. But how do I 
only add tabs when my AsyncTask has finished and the ProgressDialog has been 
dismissed? 

Je ne comprends pas cela. Pourriez-vous s'il vous plaît expliquer plus en détail?

Quoi qu'il en soit, pour regarder ces choses:

  1. Démarrer AsyncTask seulement après TabActivity est entièrement créé. Commencez par onPostCreate() au lieu de onCreate(). Cela pourrait être une source de votre NullPointerException.
  2. Vous pouvez mettre à jour toutes les activités de thread d'interface utilisateur au sein AsyncTask.onPostExecute (..)
  3. Si vous avez besoin de mettre à jour l'interface utilisateur en AsyncTask est toujours en cours en arrière-plan, puis appelez AsyncTask.publishProgress (..) à l'intérieur du AsyncTask. doInBackground (..)
+0

Salut, merci pour la réponse! Vous avez dit que je devrais démarrer AsyncTask uniquement après la création complète de TabActivity - c'est exactement mon problème. Je ne veux pas afficher d'onglet avant la fin d'AsyncTask. : -/ – cody

+0

J'ai oublié d'expliquer: Tout fonctionne parfaitement, je veux seulement que l'UI-Thread attende les données. J'ai envisagé d'initialiser le TabActivity avec mes 5 onglets contenant un ScrollView vide chacun puis en ajoutant du contenu à ceux-ci dans le AsyncTask.onPostExecute (..). Mais je ne suis pas sûr que ça marcherait ...? – cody

+0

Ça devrait marcher. Vous pouvez ajouter/modifier du contenu à tout moment après l'initialisation des widgets. Pour plus de commodité, vous devriez afficher ProgressBar et le remplacer par du contenu après son chargement. Vous pouvez mettre à jour progressivement (onglet après onglet) lorsque le contenu est disponible. Voir point 3. ci-dessus. –