2008-10-19 5 views
1

J'ai un 'framework' dans Flex qui charge et détruit les 'sections' enfants, qui sont des instances de classes de modules. Ceux-ci ont beaucoup de webservice et d'animation en eux et font partie d'un site public. Avant de supprimer une section de l'écran, j'appelle une méthode d'interface 'hideSection()' sur l'instance. Dans cette méthode, je supprime tous les contrôles, ou retourne false si la section veut éviter qu'elle soit fermée. Actuellement, il arrête également toutes les instances de Timer en cours d'exécution.Garbage collection dans Flex lorsque removeChild() est appelé - gestion des conditions de course

Le problème est que même avec l'objet de section retiré de la scène, il peut se passer des choses exceptionnelles. Par exemple, je peux avoir un effet en cours d'exécution où effectEnded déclenche quelque chose, ou peut-être une demande de service web lent peut-être expirer et provoquer une erreur à popup. En raison de la façon dont le garbage collector fonctionne - parfois cet objet objet est tué plus tôt, et d'autres fois plus tard. J'essaie de minimiser les mauvaises choses qui se produisent une fois qu'une section a été fermée.

J'ai trouvé la solution possible suivante. Je me demandais s'il y en avait un meilleur.

  • Possédez une propriété _disposed définie sur true. À l'intérieur de n'importe quel gestionnaire d'événement qui pourrait possiblement avoir un comportement indésirable (après la fermeture de la section), je dirais simplement if (_disposed) { return; }.
  • Peut également être nécessaire pour implémenter une interface 'IDisposable', comme dans .NET.

Est-ce vraiment ma seule option - ou puis-je en quelque sorte accélérer le garbage collection. La collecte des ordures peut-elle même se produire s'il y avait encore des effets?

Je suis également curieux de savoir si je devrais régler les choses à _null, en particulier les minuteries. Ou est-il suffisant de stopper() un minuteur pour qu'il soit récupéré si il n'y a plus de références.

Répondre

0

Vous pouvez supprimer tous les écouteurs d'événement actifs dans la méthode hideSection().

removeEventListener(this, listenerFunction, eventType); 

Si vous avez ajouté l'écouteur d'événement avec un weak reference, et ne pas avoir d'autres références à elle, la cible de l'auditeur doit être des ordures collectées, puis.

1

http://gskinner.com/talks/resource-management/

c'est le discours de grand skinner sur la collecte des ordures. Autour de la diapositive 32, il parle de son système de concierges. vous pouvez lire dessus puis récupérer ses fichiers sources.

aussi assurez-vous au courant de son discours sur la collecte des ordures de Flash 9: http://www.gskinner.com/blog/archives/2008/04/failure_to_unlo.html

examiner spécifiquement cette partie:

travail contournements et stratégies Il y a quatre choses principales que vous pouvez faire pour répondre à ces questions maintenant:

  1. Assurez-vous que vous retirez toujours même minuterie et enterFrame t écouteurs dans le contenu, vous pouvez charger dans une application plus grande.En outre, essayez d'éviter les écouteurs de scène lorsque cela est possible, et supprimez-les immédiatement lorsque vous en avez fini avec eux.

  2. Exposez une API standard dans vos fichiers SWF qui permet à d'autres fichiers SWF de lui demander de nettoyer et d'arrêter l'exécution. De cette façon, l'application de chargement peut appeler cette méthode (dans un bloc try/catch) avant de décharger tout contenu. Je suggère une méthode .halt(), soutenue par un écouteur pour un événement "halt" via sharedEvents.

  3. Vous pouvez charger des fichiers SWF de contenu à partir d'un sous-domaine. Cela le placera implicitement dans un sandbox de sécurité.

  4. Charger du contenu dans un div superposé sur votre application principale. Ce n'est pas une bonne option, mais elle répond à presque tous les problèmes.

Questions connexes