Flex / AS3: когда удалять слушателей? - PullRequest
8 голосов
/ 25 января 2009

У меня есть массив объектов 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 ]

9 голосов
/ 25 января 2009

Всегда хорошая идея явно удалить слушателей, когда они вам больше не нужны, да, и то, как вы это делаете, прекрасно. Это может показаться немного многословным, но это все еще хорошая практика, и она заставляет вас привыкать знать, где находятся ваши слушатели, поскольку незнание так часто приводит к утечкам и неожиданному поведению.

Что касается useWeakReference, я почти всегда использую его сам, в дополнение к удалению ненужных слушателей. Для меня это стало правилом, а не исключением. Если вам нужно было выбрать один из них, удалите слушателей явно. Лично я делаю и то и другое.

На самом деле, я нашел количество случаев, когда было бы лучше оставить useWeakReference false, поскольку это предотвратит сбор мусора, особенно редко. Действительно, прежде чем я узнал, для чего был этот аргумент ( сообщение в блоге здесь ), я потратил массу времени на то, чтобы почесать голову после того, как получил исключения во время выполнения, вытекающие из инфраструктуры Flex, выполняющей вызовы компонентов, которые я был уверен удален из списка отображения.

Дипа Субраманиам косвенно упомянула об этом в своем выступлении по модели компонентов на прошлогодней конференции MAX (отличный доклад, достойный внимания); Я полагаю, что, как она выразилась, это было что-то вроде: «Я не знаю, почему команда Flash Player решила сделать false по умолчанию, а не true, но в 99% случаев вы захотите установить это значение на правда ".

2 голосов
/ 07 февраля 2009

Если вы добавляете объекты в DisplayObject, я бы порекомендовал удалить прослушиватели при возникновении события Event.REMOVED_FROM_STAGE и добавить их при добавлении на сцену. Это простой способ удостовериться, что слушатели удалены, явно вызвав функцию removeListeners, которую вы написали. Например, в вашем сегменте кода, если загрузка не удалась, слушатели никогда не будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...