2010-12-13 6 views
0

Je développe une application simple pour Android, et je viens d'essayer de passer à l'aide d'un asynctask pour l'appel FTP et l'analyse XML que l'application nécessite (c'est une application météo FYI).Bug potentiel dans Android asynctask

Malheureusement, j'ai commencé à remarquer un comportement très étrange dans mon application. J'ai débogué, et découvert à mon horreur que le code dans la méthode doInBackground() était en panne!

Le code ci-dessous est simplifié (relevés catch ect) par souci de brièveté, mais aucun des éléments essentiels n'est modifié. L'asynctask est appelé dans onResume(), puis il appelle le serveur ftp, télécharge le fichier, puis l'analyse. Ce qui se passe (ce que je peux voir très clairement via les instructions de débogage que vous pouvez voir ci-dessous), c'est que l'appel d'analyse est fait avant que le téléchargement du fichier ne soit terminé. Ainsi, en termes des instructions de débogage, l'ordre est souvent:

  1. Avant fichier get
  2. Avant fichier Parse
  3. Après fichier parse avec l'erreur (que le fichier n'a pas encore téléchargé!)
  4. Après avoir obtenu le fichier

Je suis plus qu'heureux de fournir plus de code (le tout si nécessaire!), Et répondre à toutes les questions que quelqu'un pourrait avoir. Edit: la raison pour laquelle j'ai découvert qu'il était en cours d'exécution était que des erreurs bizarres ont commencé à se produire. Si je cours tout dans le thread principal de l'interface utilisateur, cela fonctionne, mais dès que je le mets tous dans une asynctask, j'obtiens des erreurs d'analyse XML. Le problème semble être que le fichier n'est pas entièrement téléchargé lorsque mon application tente de l'analyser.

+1

'que je peux voir très clairement via les instructions de débogage' ne jamais faire confiance aux instructions de journal! La commande peut changer, le délai que le journal est poussé peut varier ... avez-vous essayé de vraiment déboguer votre application? – WarrenFaith

+0

Oui j'ai, et quand je fais cela, il semble exécuter dans l'ordre (même les déclarations de journal sont dans l'ordre lorsque je débogue). Je soupçonne que, peut-être, lorsque je débugge le temps qu'il me faut pour franchir le code ligne par ligne, cela signifie que tout se passe dans l'ordre. – chesterm8

+0

Déboguez-vous votre application sur l'émulateur? Parfois, l'émulateur semble exécuter la méthode onResume plus d'une fois. Allez avec le verrouillage pour vérifier si un thread est en cours d'exécution avant de commencer un nouveau. – Janusz

Répondre

1

Vous vous retrouvez probablement avec plus d'un thread en cours d'exécution. Vous voyez le journal d'analyse du précédent terminer et le nouveau est en train de télécharger. Puisque vous n'en voulez probablement qu'un seul à la fois, vous devrez utiliser un certain type de verrouillage pour éviter que deux s'exécutent en même temps.

+0

C'est un très bon point, et j'ai ajouté un verrou pour éviter que cela se produise. Cependant, cela ne résout pas mon problème :( – chesterm8

0
DataRetriever.getPageContent(selectedCity, fos); 

Ceci est exécuté dans un autre thread, et il ne bloque pas. Il est donc tout à fait normal qu'il se bloque ici et pas dans le fil principal. Ne l'utilise pas.

SAXParser parseur = SAXParserFactory.newInstance().newSAXParser(); 

parseur.parse(uri, DefaultHandler); 
      // On récupère directement la liste des feeds 
      ArrayList<Object> entries = ((DefaultHandler) handler).getData(); 

Ceci est bien sûr uniquement si vous n'enregistrez pas le fichier XML dans la mémoire. Ensuite, il suffit de faire l'analyse dans une classe qui implémente DefaultHandler.

Voir le document pour plus d'informations.

Cordialement