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;

然后我做:

swfLoader.load(file1);

稍后的:

swfLoader.unloadAndStop(true);

它会卸载视频,但不会卸载声音!所以我添加

SoundMixer.stopAll();

没关系,有一段时间。后来,我这样做:

swfLoader.load(file2);

最终,在观看 file2 时,file1 的音频将开始在后台播放 file2 的音频,无法停止!停止file1音频的正确方法是什么?我一直看到的方式是使用我正在使用的 unloadAndStop() 。除非我每次都必须创建一个新的 swfLoader 对象?

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

4

2 回答 2

2

解决方案有点棘手,因为问题在于加载的内容。

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

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

我们经常忘记在我们的应用程序之后进行清洁。如果它们与 Flash Player 的实例相同,则没有问题(删除它会清除我们 swf 使用的所有内存)。当我们加载和卸载 swf 时,问题就开始了。忽略清理是内存泄漏的快速方法。

于 2013-04-21T02:12:14.743 回答
0

swfLoader.unloadAndStop(true);

是否也删除了 swf 和声音。对我来说很好。甚至文档都说:卸载图像或 SWF 文件。此方法返回后,源属性将为空。仅当主机 Flash Player 为 10 或更高版本时才支持此功能。如果主机 Flash Player 版本低于 10,则此方法将卸载内容,就像源设置为 null 一样。此方法尝试通过删除对子 SWF 文件的 EventDispatcher、NetConnection、Timer、Sound 或 Video 对象的引用来卸载 SWF 文件。因此,子 SWF 文件和子 SWF 文件的显示列表会发生以下情况: 声音停止。 舞台事件监听器被移除。删除了 enterFrame、frameConstructed、exitFrame、activate 和 deactivate 的事件侦听器。计时器停止。相机和麦克风实例分离 电影剪辑停止。

于 2013-05-04T09:08:54.913 回答