2009-01-24 8 views
8

Ich habe ein Array von FileReference-Objekten, die mehrere Listener an jedes von ihnen angehängt haben, sollte ich jeden Listener in seiner Handler-Methode entfernen, oder sollte ich sie alle im kompletten Handler entfernen?Flex/AS3: Wann Hörer entfernen?

Ich habe irgendwo gelesen schwache Referenzen für die Hörer zu verwenden, aber ich würde denken, es wäre besser, explizit Hörer zu entfernen (ja?/Nein?)

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); 
} 

Antwort

9

Es ist immer eine gute Idee, Ihre Zuhörer ausdrücklich zu entfernen wenn du sie nicht mehr brauchst, ja, und die Art, wie du es machst, ist in Ordnung. Es mag ein wenig wortreich erscheinen, aber es ist immer noch eine gute Übung, und es hält Sie in der Angewohnheit, zu wissen, wo Ihre Zuhörer sind, da es nicht so oft zu Leaks und unerwartetem Verhalten führt.

Was useWeakReference betrifft, benutze ich es fast immer selbst und entferne unnötige Listener. Für mich ist es eher die Regel als die Ausnahme. Wenn Sie jedoch eine auswählen mussten, entfernen Sie Ihre Listener explizit. Persönlich tue ich beides.

In der Tat habe ich die Anzahl der Gelegenheiten gefunden, in denen es am besten wäre, useWeakReference false zu lassen, da dies dazu beiträgt, dass Objekte nicht als Müll gesammelt werden, ist besonders selten. In der Tat, bevor ich gelernt habe, für was dieses Argument war (blog post here), verbrachte ich eine Menge Zeit mit dem Kopf kratzen nach Laufzeitausnahmen aus dem Flex-Framework Aufrufe an Komponenten, die ich war sicher, dass ich aus der Display-Liste entfernt hatte.

Deepa Subramaniam erwähnt es schräg in her component-model talk bei der letztjährigen MAX-Konferenz (ein ausgezeichnetes Gespräch, das es wert ist, es sich anzuschauen); Ich glaube, die Art, wie sie es formulierte, war so etwas wie: "Ich weiß nicht, warum das Flash-Player-Team fälschlicherweise den Standard als falsch gewählt hat, aber in 99% der Fälle möchten Sie diesen Wert festlegen wahr."

+0

Ihr Blog-Beitrag war hilfreich, überprüft die MAX Talk auch, danke. – Ronn

2

Wenn Sie Objekte zu einem DisplayObject hinzufügen, würde ich empfehlen, Listener zu entfernen, wenn das Event.REMOVED_FROM_STAGE-Ereignis ausgelöst wird, und diese hinzuzufügen, wenn es zur Bühne hinzugefügt wird. Auf diese Weise können Sie sicherstellen, dass Listener entfernt werden, indem Sie die removeListeners-Funktion, die Sie geschrieben haben, explizit aufrufen müssen. Wenn zum Beispiel in Ihrem Code-Segment der Ladevorgang fehlschlägt, werden die Listener niemals entfernt.