3

我需要对这个主题进行一些澄清,因为我刚刚遇到了将 swfs 加载到重用的加载器对象的问题。

所以假设我有 3 个 SWF。
Main.swf
childA.swf
childB.swf

Main.swf 中有一个加载器对象,可以重用 (myloader.load("childA.swf")),并且 childA 或 childB swf 将通过用户交互加载。
两个子 swf 都有一个 com 包,该包中有一个名为 config 的类。
配置文件是两个名称相同的类的不同文件。
两个子 swf 还调度 Main 侦听的事件

现在我遇到的问题是,如果先加载 childA,然后在加载 childB 之后,它仍然会显示为 childA。基本上,无论哪个最先被加载到该装载机中,都会成为赢家。
这让我发疯了,因为我所做的任何事情都不会导致 swf 卸载。直到我找到以下代码。

var appDomain:ApplicationDomain = new ApplicationDomain();
var context:LoaderContext = new LoaderContext(false, appDomain);
_contentPanel.load(new URLRequest(str), context);

我在某处谈论如何真正卸载 swf 的帖子上偶然发现了这段代码。显然,这也适用于如何真正加载 swf。
如您所见,在加载时创建了一个新的 appDomain 并将其分配给上下文。
这就像一个梦想,我现在可以整天加载和卸载。

我的困惑是孩子调度的事件仍然有效,当我认为 Main swf 不应该接收它时,因为它不在同一个 appDomain 中。
我的意思是不应该阻止事件吗?

4

1 回答 1

2

卸载 SWF

Loader 类提供Loader.unload()(或在 Flash Player 版本 10 之后 - Loader.unloadAndStop()

第二个加载的 SWF 被第一个覆盖的问题

存储在ApplicationDomains 中的对象由它们的类名存储,我想知道加载的 SWF(或其子级)的类名是否被覆盖。即使不是这样;为什么不为每个正在加载的对象使用一个新的 Loader 实例?

主 SWF 如何从另一个应用程序域中获取两个子级

主 SWF 将能够与新的(加载的)应用程序域一起工作,因为它们是主 SWF 的子域(请参阅 ApplicationDomain.parentDomain)。主 SWF 的域将是“系统域”,新实例将在其下方加载。

从加载器中拆分加载的 SWF

理想情况下,您希望能够访问与Loader. 您可以通过在加载后访问 SWF 的根 movieClip 并创建一个新实例来执行此操作

var rootClipClass:Class = ApplicationDomain.getDefinition("[InsertYourRootClipName]") as Class; 
var rootClip:MovieClip = new rootClipClass(); 

此时,您可以卸载加载程序并干净地使用您的新实例。

进一步阅读

于 2012-12-06T21:10:04.943 回答