1

我的应用程序需要通知 UI 声音播放完成。为此,将侦听器附加到 SoundChannel 对象的 SOUND_COMPLETE 事件。

事件处理完成后,我应该删除我的 SOUND_COMPLETE 事件侦听器吗?

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

每个人都说我们应该始终删除事件监听器,以便 GC 可以正确收集对象(在本例中为“通道”对象)。但似乎 Adob​​e 在官方文档中没有这样做 [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

4

2 回答 2

2

Dispatcher 拥有监听器,因此,如果您的Dispatcher 是长期存在的(如 Application),您应该使用弱监听器:

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

lasttrue允许你的对象被释放。

如果您在释放对临时对象的所有引用并收集它们之前不需要临时对象来处理调度程序的事件,则应删除侦听器

否则(当调度员是短暂的)没有必要关心听众:如果你正在听临时的东西,它会毫无问题地死去。

看来你的case是最后一个了,所以最好不要用无意义的行污染代码。

于 2013-07-14T13:40:18.370 回答
0

你的问题说明了我对此的回答

每个人都说我们应该总是删除事件监听器,以便 GC 可以正确收集对象

如果您不再保留Sound对象的实例;然后删除事件侦听器。如果您仍将使用 Sound 对象;那么就不需要移除监听器了。

于 2013-07-14T13:25:18.143 回答