Flex / AS3:何时删除监听器?

时间:2009-01-24 22:43:30

标签: flex actionscript-3

我有一个FileReference对象数组,每个对象都附加了几个侦听器,我应该删除每个侦听器的处理程序方法,还是应该在完整的处理程序中删除它们?

我在某处读取了对侦听器使用弱引用,但我认为明确删除侦听器会更好(是吗?/不?)

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

2 个答案:

答案 0 :(得分:9)

当你不再需要它时,明确地删除你的听众总是一个好主意,是的,你做的方式很好。它可能看起来有点冗长,但它仍然是一种很好的做法,它会让你养成知道听众在哪里的习惯,因为不会经常知道导致泄漏和意外行为。

至于useWeakReference,除了删除不需要的监听器之外,我几乎总是自己使用它。对我来说,它成为规则而不是例外。但是,如果必须选择一个,请明确删除您的侦听器。就个人而言,我同时做到了。

事实上,我已经找到了最好将useWeakReference置为假的次数,因为这样做会阻止对象被垃圾收集,这种情况尤为罕见。事实上,在我了解了这个论点之前(blog post here)之前,我花了很多时间在获得源自Flex框架的运行时异常之后抓住了我的头部调用组件,我确信我已从显示中删除名单。

去年的MAX会议上,Deepa Subramaniam在her component-model talk中倾斜地提到了这一点(一个值得一试的优秀演讲);我相信她说的方式是这样的,“我不知道为什么Flash播放器团队选择将默认设置为默认而不是真实,但99%的情况下,你会想要将该值设置为真正的“。

答案 1 :(得分:2)

如果要向DisplayObject添加对象,我建议在触发Event.REMOVED_FROM_STAGE事件时删除侦听器,并在将其添加到舞台时添加它们。这是一种简单的方法,可以确保必须调用您编写的removeListeners函数来删除侦听器。例如,在您的代码段中,如果加载失败,则永远不会删除侦听器。