2011-07-19 14 views
1

我有一個按鈕,當點擊加載我的AIR應用程序中的Flex模塊。但是,有時單擊按鈕時第一次加載模塊失敗,但第二次點擊它時會起作用。當我在調試器中調試它時,READY事件不會被觸發,所以剩下的邏輯永遠不會被調用。加載一個模塊失敗了第一次load()被調用,但成功

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來解決其他問題,但是在那裏或刪除它似乎沒有什麼區別。有時模塊只是不加載。輸出大致如下:

[跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [SWF] MyStupidModule.swf - 解壓縮後的342,932個字節 [跟蹤] ModuleEvent.SETUP調用。 [跟蹤] ModuleEvent.PROGRESS調用。

注意READY從不會被調用,也不會是ERROR。如果我再次點擊按鈕,這裏是打印輸出:

[跟蹤] ModuleEvent.SETUP調用。 [跟蹤] ModuleEvent.PROGRESS調用。 [跟蹤] ModuleEvent.READY調用。

任何線索什麼可能導致這種情況?我們使用Flex 3.6.0 AIR 2.6.019

+0

您使用ModuleManager而不是ModuleLoader的任何特定原因? –

回答

3

商店參考某處所有者類的ModuleInfoProxy(IModuleInfo) - 的實例ModuleManager.getModule()返回給你,例如

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

ModuleInfoProxy使用弱引用事件如果對象沒有更多的引用,GC可以使用事件處理程序完全刪除它。一旦load()方法退出,將對IModuleInfo的引用存儲在局部變量中使該對象符合GC要求。如果在模塊完全加載之前發生這種情況,您的監聽器將不會被回調。

+0

我認爲這實際上可能是答案。感謝您發佈它! – chubbsondubs

+0

http://codebrief.com/2008/11/two-nasty-flex-bugs-to-watch-out-for/ – chubbsondubs

1

這是被固定在SDK

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

嘗試更新到最新的SDK兼容實際的錯誤,你應該設置。它應該在你列出的SDK中修復,但不會受到傷害。

如果它不適合你,我會幫你制定解決方法。

好消息是你不是瘋了,這是一個框架錯誤。

=)

+0

我正在使用3.6您發佈的bug說3.4是它修復的SDK。難道我沒有修復?我也沒有使用RSL來處理這個問題嗎? – chubbsondubs

相關問題