2013-04-20 102 views
1
public var swfLoader:SWFLoader = new SWFLoader(); 

[Embed(source="/some/file1.swf")] 
public var file1:Class; 

[Embed(source="/some/file2.swf")] 
public var file2:Class; 

然后我做的:如何让Flex SWFLoader unloadAndStop卸载声音?

swfLoader.load(file1); 

后来:

swfLoader.unloadAndStop(true); 

其卸载视频,但没了声音!所以我加入

SoundMixer.stopAll(); 

这是好的,一段时间。后来,我做的:

swfLoader.load(file2); 

最终,一边看文件2,文件1的音频将开始在后台播放过文件2的音频,没有办法阻止它!什么是停止file1音频的正确方法?我一直看到的方式是使用我正在使用的unloadAndStop()。除非我每次都必须创建一个新的swfLoader对象?

根据Konrad的回答,我应该停止播放清理事件中的声音,例如REMOVED_FROM_STAGE,但是,如何停止播放使用SWFLoader加载的swf文件的声音?我没有看到明显的做法。

回答

2

解决方法有点棘手,因为问题是加载的内容。

由于垃圾收集器仍在播放(因此它被Flash Player引用),但您无法访问其声音通道(因为其隐藏类似于类中的私有变量),所以垃圾收集器不会删除声音。这种行为是完全正确的。

解决方案:在加载的swf代码中,您应该停止播放该声音(在REMOVED_FROM_STAGE或其他“清理”事件处理程序中)。其他解决方案(如SoundMixer.stopAll)可以在某些情况下工作,但不会。

我们经常忘记在我们的应用程序后清理。它没有问题,如果他们存在与Flash Player的实例相同(删除它将清除我们的swf使用的所有内存)。当我们加载和卸载swfs时,问题就开始了。忽视清理是内存泄漏的快速途径。

+0

谢谢您的回复。我最终从这个答复中发现了它。我所做的是将REMOVED_FROM_STAGE事件处理程序添加到内部(加载的)swf中的DisplayObject(root),并删除其中的所有事件处理程序,然后调用stop();. – StackQ 2013-04-30 17:35:09

0

swfLoader.unloadAndStop(true);

是否也删除swf和声音。 适合我。 即使文档中提到: 卸载图像或SWF文件。此方法返回后,源属性将为空。这仅在主机Flash Player版本为10或更高时才受支持。如果主机Flash Player的版本低于版本10,则此方法将以与source设置为null相同的方式卸载内容。此方法尝试通过删除对子SWF文件的EventDispatcher,NetConnection,Timer,Sound或Video对象的引用来卸载SWF文件。因此,子SWF文件和子SWF文件的显示列表会发生以下情况: 声音已停止。 舞台事件侦听器被删除。 删除enterFrame,frameConstructed,exitFrame,激活和停用的事件侦听器。 定时器停止。 相机和麦克风实例分离 影片剪辑已停止。