第一次调用load()时加载模块失败,但之后成功

时间:2011-07-19 20:40:55

标签: flex module

我有一个按钮,单击该按钮会在我的AIR应用程序中加载Flex模块。但是,偶尔模块在第一次单击按钮时无法加载,但它在第二次单击时会起作用。当我在调试器中调试它时,不会触发READY事件,因此永远不会调用剩余的逻辑。

var moduleInfo:IModuleInfo = ModuleManager.getModule(managedModule.url);
moduleInfo.addEventListener(ModuleEvent.READY, function(event:ModuleEvent):void {
    trace("ModuleEvent.READY called.");
});
moduleInfo.addEventListener(ModuleEvent.ERROR, function(event:ModuleEvent):void {
    trace("ModuleEvent.ERROR called.");
});
moduleInfo.addEventListener(ModuleEvent.SETUP, function(event:ModuleEvent):void {
    trace("ModuleEvent.SETUP called.");
});
moduleInfo.addEventListener(ModuleEvent.PROGRESS, function(event:ModuleEvent):void {
    trace("ModuleEvent.PROGRESS called.");
});
moduleInfo.addEventListener(ModuleEvent.UNLOAD, function(event:ModuleEvent):void {
    trace("ModuleEvent.UNLOAD called.");
});
moduleInfo.load(ApplicationDomain.currentDomain);

需要ApplicationDomain.currentDomain来修复其他问题,但是将其存在或删除它似乎没有什么区别。有时模块不会加载。输出大致如下:

[trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.PROGRESS。 [SWF] MyStupidModule.swf - 解压后342,932字节 [trace]调用ModuleEvent.SETUP。 [trace]调用ModuleEvent.PROGRESS。

注意从不调用READY,也不是ERROR。如果我再次单击该按钮,则打印出来的内容:

[trace]调用ModuleEvent.SETUP。 [trace]调用ModuleEvent.PROGRESS。 [trace]调用ModuleEvent.READY。

任何可能导致此问题的线索?我们使用的是Flex 3.6.0 AIR 2.6.019

2 个答案:

答案 0 :(得分:3)

将所有者类中的某个引用存储到ModuleInfoProxy(IModuleInfo) - ModuleManager.getModule()为您返回的实例,例如

class MyMainClass
{
           private var moduleInfo:IModuleInfo;
           public function load():void
           {
                 moduleInfo = ModuleManager.getModule("SimpleModule.swf");
                 ...
           }    
}

ModuleInfoProxy使用弱引用事件,如果对象没有更多引用,GC可以使用事件处理程序将其完全删除。在本地变量中存储对IModuleInfo的引用,一旦load()方法退出,该对象就有资格获得GC。如果在模块完全加载之前发生这种情况,则不会回叫侦听器。

答案 1 :(得分:1)

这是SDK中修复的实际错误

http://bugs.adobe.com/jira/browse/SDK-14669

尝试更新到最新的兼容SDK,您应该进行设置。它应该在你列出的SDK中修复,但不会受到伤害。

如果它不适合你,我会帮你制作一个工作。

好消息是你不是疯了,这是一个框架错误。

=)