2009-10-22 6 views
0

J'essaie de réutiliser l'objet HTTPService dans une application flexible, mais je rencontre un problème. Dans le gestionnaire pour ResultEvent.RESULT je supprime l'écouteur, mais il n'est pas supprimé. Je dois attraper le asyncToken de send() et attacher une nouvelle propriété ainsi je sais ce qu'il est censé faire dans le gestionnaire.Problèmes lors de la réutilisation de l'objet HTTPService

J'ai mis en place un exemple ici: http://www.152.org/flex/
Vous pouvez cliquer avec le bouton droit de la souris et afficher la source.

Est-ce que quelqu'un d'autre a rencontré un problème où les écouteurs ne sont pas supprimés? HTTPService ne devrait-il pas être réutilisé?

Répondre

0

Je suis tombé sur ce problème aujourd'hui sur une application qui fonctionnait bien depuis plusieurs mois. Après des heures de débogage serval, j'ai découvert qu'une mise à niveau récente de mes paramètres de compilateur flex de 3.1 à 3.4 était le coupable. Pour l'instant j'ai restauré 3.1 comme environnement de compilation pour que mon projet continue de fonctionner. À mon avis, il s'agit d'un bug majeur introduit après Flex 3.1, j'espère que Adobe va le réparer bientôt. Je réutilise HTTPService tout le temps partout dans mon code et ce bogue rend la version 3.4 pas réalisable pour moi.

Espérons que cela aide.

+0

bon de savoir ceci savoir c'était un bogue et pas un problème avec mon code. Je vais devoir mettre à jour cet exemple pour réutiliser le service et le soumettre en tant que bogue à Adobe. Merci. – metric152

+0

Vous avez raison. J'ai testé une version balisée de mon code avec flex 3.0 et cela a fonctionné parfaitement.C'est un nouveau bug dans le code. Je vais soumettre ceci à Adobe. Merci pour votre aide. – metric152

+0

J'ai signalé cela comme un bug à Adobe. https://bugs.adobe.com/jira/browse/SDK-24847 – metric152

0

Il n'y a aucune garantie que l'écouteur d'événements sera supprimé. Essayez d'en faire un gestionnaire d'événements faible lors de l'installation sur votre objet. Il y a de meilleures chances que le GC de Flex le libère lorsque vous le supprimez.

+0

J'ai essayé de créer une référence faible et je ne les supprime toujours pas. .addEventListener (ResultEvent.RESULT, populateTilelist, false, 0, true); .removeEventListener (ResultEvent.RESULT, populateTilelist, false); – metric152

+0

Comme je l'ai dit, c'est à la VM de faire GC. C'est la bonne approche. Toutefois, la machine virtuelle AS3 trouve apparemment une référence pointant toujours vers cette ressource et par conséquent ne supprime pas les gestionnaires d'événements. Il est temps de vérifier le reste du code, je crois? – dirkgently

3

Vous ne pouvez pas supprimer les écouteurs d'événement ajoutés dans la balise mxml. livedocs dit:

Vous pouvez supprimer des écouteurs d'événements seulement que vous avez ajoutés à la méthode addEventListener() dans un bloc ActionScript. Vous ne pouvez pas supprimer un écouteur d'événement qui a été défini dans la balise MXML

Définir vos HTTPService objets en actionscript (creationComplete de l'application) et ajouter des écouteurs d'événement en utilisant la méthode addEventListener afin que vous puissiez appeler removeEventListener sur les réutiliser.

+0

C'est l'approche que j'utilise actuellement. Les événements ne sont pas supprimés lorsque j'appelle removeEventListener. – metric152

+0

Relisez-le. Les écouteurs d'événements ajoutés via mxml ** ne peuvent pas être supprimés à l'aide de removeEventListener. Période. – Amarghosh

+0

Maintenant, je comprends ce que vous voulez dire. Je pensais que tu voulais dire si tu utilisais quelque chose en ligne sur un tag MXML. Comme je crée l'appel HTTPService dans un fichier .MXML, je ne peux pas utiliser removeEventListener. Je vais essayer ça lundi. – metric152

Questions connexes