我有一个按钮,单击该按钮会在我的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
答案 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中修复,但不会受到伤害。
如果它不适合你,我会帮你制作一个工作。
好消息是你不是疯了,这是一个框架错误。
=)