2009-01-24 7 views
8

J'ai un tableau d'objets FileReference qui ont plusieurs écouteurs attachés à chacun d'eux, dois-je supprimer chaque écouteur dans sa méthode de gestionnaire, ou dois-je les supprimer tous dans le gestionnaire complet?Flex/AS3: Quand faut-il retirer les écouteurs?

Je lis quelque part d'utiliser des références faibles pour les auditeurs, mais je pense qu'il serait préférable de supprimer explicitement les auditeurs (oui?/Non?)

for each(var f:Object in fileCollection){ 
    var myFile:FileReference = f.file; 
    myFile.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.addEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.addEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.addEventListener(Event.COMPLETE, onComplete); 
} 

private function onUploadCompleteData(e:DataEvent):void{ 
    // doin my thing here 
    removeListeners(e) 
} 

private function removeListeners(e:Event):void{ 
    var myFile:FileReference = FileReference(e.target) 
    myFile.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.removeEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.removeEventListener(Event.COMPLETE, onComplete); 
} 

Répondre

9

Il est toujours une bonne idée de supprimer vos auditeurs explicitement quand vous n'en avez plus besoin, ouais, et la façon dont vous le faites va bien. Cela peut sembler un peu verbeux, mais c'est toujours une bonne pratique, et cela vous permet de savoir où sont vos auditeurs, car ils ne savent pas si souvent qu'il y a des fuites et des comportements inattendus. En ce qui concerne useWeakReference, je l'utilise presque toujours moi-même, en plus de supprimer les écouteurs inutiles. Pour moi, c'est devenu la règle plutôt que l'exception. Si vous deviez en choisir un, supprimez vos écouteurs explicitement. Personnellement, cependant, je fais les deux.

En fait, j'ai trouvé le nombre d'occasions où il serait préférable de laisser useWeakReference false, car cela empêcherait les objets d'être collectés, ce qui est particulièrement rare. En effet, avant de savoir à quoi servait cet argument (blog post here), j'ai passé une tonne de temps à me gratter la tête après avoir obtenu des exceptions d'exécution issues du framework Flex faisant des appels sur des composants que j'étais sûr de retirer de la liste.

Deepa Subramaniam l'a mentionnée obliquement dans her component-model talk lors de la conférence MAX de l'année dernière (une excellente conférence qui vaut le détour); Je crois que la façon dont elle l'a dit était quelque chose comme: «Je ne sais pas pourquoi l'équipe du lecteur Flash a choisi de faire le faux par défaut plutôt que le vrai, mais 99% du temps, vous allez vouloir mettre cette valeur à vrai."

+0

Votre article de blog a été utile, a également jeté un coup d'œil sur la conversation MAX, merci. – Ronn

2

Si vous ajoutez des objets à un objet DisplayObject, je vous recommande de supprimer les écouteurs lorsque l'événement Event.REMOVED_FROM_STAGE est déclenché et de les ajouter lorsqu'il est ajouté à la scène. C'est un moyen facile de s'assurer que les écouteurs sont supprimés en appelant explicitement la fonction removeListeners que vous avez écrite. Par exemple, dans votre segment de code, si le chargement échoue, les écouteurs ne seront jamais supprimés.

Questions connexes