【问题标题】:How to get Flex SWFLoader unloadAndStop to unload sound also?如何让 Flex SWFLoader unloadAndStop 也卸载声音?
【发布时间】:2013-04-20 21:34:05
【问题描述】:
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 文件上播放声音?我没有看到明显的方法来做到这一点。

【问题讨论】:

    标签: actionscript-3 apache-flex flash flex4.6 swfloader


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。我最终从这个回复中弄清楚了。我所做的是将 REMOVED_FROM_STAGE 事件处理程序添加到内部(加载)swf 中的 DisplayObject(root) 并删除其中的所有事件处理程序,然后调用 stop();。
    【解决方案2】:

    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 的事件侦听器。 计时器停止。 相机和麦克风实例已分离 电影剪辑停止。

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多