Key.addListener, Key.removeListener

  • warning: array_map(): Argument #2 should be an array in /var/www/titouille.ch/www/modules/system/system.module on line 1050.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
  • warning: Invalid argument supplied for foreach() in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
Portrait de titouille

Voici déjà quelques temps que je n'avais rien écrit sur le blog. Je me suis sérieusement penché sur Flash-Media-Server pour les besoins d'un client et prend beaucoup de plaisir à étudier le système et son fonctionnement. Si j'ai la motivation, je ferai surement quelques tickets à son propos, car des explications simples et détaillées sur le fonctionnement global et les possibilités sont relativement difficiles à dénicher sur la toile.

Dans le cadre de cet apprentissage, j'ai été confronté à un problème un peu particulier sur mon application.
Je travaille généralement avec AS2. Je crée un système qui me permet d'affecter des contenus dans ma structure sous forme de classes.

Par exemple : un site de 5 pages serait à priori composé de 5 "vues" différentes, correspondant chacune à une page (sauf si une vue est réutilisée). Pour chaque vue que je veux créer, je crée donc une classe et l'associe à un contrôleur dans mon application, qui va s'occuper d'afficher ou masquer le bon contenu à la demande (automatiquement via un menu, ou manuellement via du code).

Bref. Dans mes pérégrinations avec FMS, j'ai donc créé une vue permettant de faire de la visio-conférence. Pour faire bien, j'ai attaché un écouteur à l'évènement onKeyDown pour pouvoir détecter l'appui de la touche "entrée" lorsqu'un utilisateur à tapé son texte dans la zone de texte dédiée à cet effet :

obj = new Object();
obj.onKeyDown = Delegate.create( this, onKeyDownText );
Key.addListener( obj );

Tout fonctionne correctement, mes données sont envoyées. Je continue donc à coder mon site, et puis, pour je ne sais quelle raison, je me retrouve à charger plusieurs fois de suite ma vue dans l'application (passage d'une page à l'autre) et là, je me rends compte que dès le second chargement, l'évènement onKeyDown ne semble plus être détecté...

Je fais un debug, mais pourtant, il est détecté, les évènements sont appelés de manière correctes, jusqu'au "nc.call( ... )" qui me permet de faire un envoi en direction du serveur de streaming. Ce dernier ne semble pas fonctionner... Pourtant, un bouton "send" à coté de ma zone de texte envoie bien les données vers le serveur...

A n'y rien comprendre... Je trace l'instance de NetConnection, et lorsque la méthode est appelée via le bouton, l'instance existe, alors que lorsque la méthode est appelée via l'écouteur appliqué sur Key, cette fois l'instance n'est pas définie...

J'ai galéré un petit moment, cherché à intégrer dans mon projet des composants MX (quelle galère... à peu près réussi dans un projet simple, mais pas dans mon projet déjà avancé...) et j'ai fini par me remettre sur le vrai problème pour le solutionner, et c'était plus simple qu'il n'y paraissait...

Dans ma structure de développement, un évènement "onRemove" est appelé dans la portée de la vue lorsque la page est déchargée pour en afficher une autre.

Je n'ai eu qu'a placer mon "obj" en variable de classe et utiliser la méthode Key.removeListener( obj ) dans le callback "onRemove" pour que ça fonctionne.

Sans trop m'avancer, j'imagine que lorsqu'un écouteur est lancé, il fait référence à des objets précis en mémoire. Mon écouteur n'est pas détruit lorsque ma page est supprimée, car il fait référence à un objet global Key, et lorsque je recharge une nouvelle fois ma page, ce sont de nouvelles instances d'objets qui sont créées et l'écouteur fait toujours référence aux anciennes.

D'où l'utilité des méthodes de suppression des écouteurs qu'on a tendance à gentiment oublier lorsqu'on code Laughing out loud

A bon entendeur...