2013-07-14 72 views
1

我的應用程序需要通知UI聲音播放已完成。爲了實現這個目標,將偵聽器附加到SoundChannel對象的SOUND_COMPLETE事件中。我應該刪除監聽器的SOUND_COMPLETE事件嗎?

事件處理完成後,我應該刪除我的SOUND_COMPLETE事件偵聽器嗎?

private function playbackCompleteHandler(event:Event):void { 
    // Notify UI that playback is done etc 
    channel.removeEventListener(Event.SOUND_COMPLETE, playbackCompleteHandler); 
} 

大家都說我們應該總是刪除事件偵聽器,以便GC可以正確收集對象(在這種情況下,'channel'對象)。但似乎Adobe沒有做到這一點的官方文檔中[1] [2]

[1] http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundChannel.html [2] http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d21.html

回答

2

調度持有的聽衆,所以,如果你的調度員是長期生活(如應用程序),你應該使用弱聽者

channel.removeEventListener(Event.SOUND_COMPLETE, playbackCompleteHandler,false,0, true)

最後true允許釋放你的對象。

如果您不需要臨時對象進程調度的事件,你失去了對臨時對象,它們被收集到,你要刪除監聽器

否則(當調度員短版活)所有引用後,有不需要關心聽衆:如果你正在聽一些暫時的東西,它會死掉而沒有任何問題。

看來你的情況是最後一個,所以最好不要污染無意義的代碼。

+1

http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth-of-useweakreference/ – csomakk

0

你的問題陳述我的回答這個

大家都說,我們應該隨時移除事件偵聽器,使GC 能妥善收集對象

如果您不再保持012的一個實例對象周圍;然後刪除事件偵聽器。如果您仍將使用Sound對象;那麼就不需要刪除這個監聽器了。

+0

我將使用聲音對象,但不會使用通道對象。 SOUND_COMPLETE是通道對象的事件。看起來我應該刪除監聽器。謝謝。 –

+0

我想我不明白你的意思是「通道」對象。你是否使用這個類來聲音:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/messaging/Channel.html? – JeffryHouser

+1

我的意思是SoundChannel。 var channel:SoundChannel = sound.play(); –