2009-06-26 4 views
0

J'ai une application flexible qui interroge à plusieurs reprises un fichier XML distant pour détecter les changements, mais j'ai constaté qu'une fois que le fichier atteint une certaine taille, le sondage bloque l'interface utilisateur et rend la page peu réactive.Comment interroger de manière asynchrone un fichier à l'aide d'une minuterie flash sans bloquer l'interface utilisateur?

Est-il possible de s'assurer que l'appel effectué sur le serveur ou l'événement de la classe flash.utils.Timer s'exécute de manière asynchrone par rapport au thread d'interface utilisateur principal?

Répondre

1

Branden a raison - le code que nous écrivons se passe toujours sur le thread principal; Alors que l'appel réseau lui-même se produit sur un thread d'arrière-plan, la gestion de cet appel se produit sur le principal. Une chose à garder à l'esprit est que les classes WebService et HTTPService essaieront probablement de sérialiser automatiquement vos réponses, ce qui pourrait signifier que le traitement ne soit pas nécessaire. D'un autre côté, l'utilisation de URLLoader pourrait vous donner un accès plus direct aux données de réponse, vous permettant de travailler plus directement avec lui sans le surcoût inutile de ce traitement intégré. De ce point de vue, si vous trouvez que vous devez traiter l'ensemble du fichier XML, vous pouvez envisager de le décomposer en plusieurs parties, et de distribuer le traitement de ces morceaux dans des fonctions distinctes, plutôt que de tout gérer dans le cadre de une seule fonction. Cela pourrait permettre au lecteur de continuer à mettre à jour l'interface utilisateur pendant le traitement de ce gros paquet de texte (traitement d'un bit, sortie de la fonction, affichage de l'interface utilisateur, saisie de la fonction suivante, rendu, etc.); Oliver Goldman, un ingénieur de l'équipe AIR, a fait un presentation on this concept at last year's MAX conference.

J'espère que ça aide!

3

Il semble que le blocage soit dû à l'analyse de XML par Flash au lieu du chargement réel.

Si tel est le cas, vous pouvez continuer à charger le fichier et simplement vérifier la taille des données brutes que vous récupérez - si elle est plus grande, parser et prendre le coup d'analyse. Sinon, jetez les données et attendez la prochaine requête.

Il n'existe pas de façon explicite de faire du threading avec Flash pour le moment. Certaines tâches se produisent naturellement (réseau et pixelbender viennent à l'esprit) mais c'est tout.

+0

Je l'ai vu la même chose lorsque de très grandes réponses SOAP dans les applications Flex. –

1

Comme mentionné, AS3 est à filetage unique. Mais il y a plusieurs façons de gérer votre situation. Tout d'abord, assurez-vous que vous avez vraiment besoin d'analyser tout le XML quand vous êtes chargé et que vous ne pouvez pas garder les nœuds xml chargés en mémoire comme modèle de données (XML étant un type de données natif maintenant). Parfois, je crée des objets de valeur en leur passant un XMLNode et ils sont gardés en mémoire jusqu'à ce qu'une valeur de nœud soit nécessaire à quel point je l'ai lu. Cela vous permet de conserver une partie de l'analyse pour plus tard.

Si vous utilisez une ArrayCollection ou une structure similaire à contenir des données, essayez d'utiliser un tableau primitif (voir http://www.arpitonline.com/blog/?p=114 pour une question que je suis tombé sur)

Voyez si vous pouvez créativement utiliser callLater() (http://livedocs.adobe.com/flex/2/langref/mx/core/UIComponent.html#callLater())

Pouvez-vous transmettre les données au client dans un format natif comme SWX ou en utilisant Remoting

Pouvez-vous utiliser la radiomessagerie?ArrayCollections et je suis assez sûr soutien XMLCollection il

Side Note:

Alors que AS3 seul thread, Pixel Bender et je pense que l'alchimie (http://labs.adobe.com/technologies/alchemy/) exécuté sur un thread différent. Il y a eu quelques expériences sur des blogs utilisant Pixel Bender pour faire des calculs qui ne ralentissent pas l'IU de l'application (Exemple: http://elromdesign.com/blog/2009/02/09/using-pixel-bender-to-do-heavy-lifting-calculations-makes-flash-player-multi-thread/).

s'il vous plaît également voter sur cette fonctionnalité billet d'amélioration avec Adobe si vous ressentez le besoin de cette fonctionnalité assez: https://bugs.adobe.com/jira/browse/ASC-3222

+0

Alchemy s'exécute sur le même fil (car il est juste AS). Cependant, le LVVM prend en charge son propre modèle de threading vert, qui vous permet d'écrire des threads d'arrière-plan - mais ce sont des threads logiciels, pas des threads OS. –

Questions connexes