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:
- Avant fichier get
- Avant fichier Parse
- Après fichier parse avec l'erreur (que le fichier n'a pas encore téléchargé!)
- 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.
'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
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
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