在使用ModuleLoader加載器;和使用ModuleManager進行加載flex模塊時,必須要把對應的變量定義爲全局變量, 否則其READY事件不會觸發。
參考過很多資料, 歸其根本是由於在加載器調用了load方法後, 如果變量未定義爲全局變量,那麼可能被flxe的gc機制給卸載掉,也即根本的解決方法是不然加載器被gc,即要使用時必須留有應用。由於開始沒明白其中道理,犯了個錯誤。如代碼:
- public class TaskLoadModule
- {
- public function TaskLoadModule()
- {
- super();
- }
- protected var moduleInfo:IModuleInfo
- public function loadFromLocal($local:String):void{
- moduleInfo = ModuleManager.getModule(local);
- moduleInfo.addEventListener(ModuleEvent.READY,moduleInfoReadyHandler);
- moduleInfo.addEventListener(ModuleEvent.ERROR,moduleInfoErrorHandler);
- moduleInfo.addEventListener(ModuleEvent.PROGRESS,moduleProgressHandler);
- trace('Module start load');
- moduleInfo.load();
- }
- public function moduleProgressHandler($e:ModuleEvent):void{
- trace('Module load progress: '+$e.bytesLoaded+" / "+$e.bytesTotal);
- }
- public function moduleInfoReadyHandler($e:ModuleEvent):void{
- trace('Module load ready: '+local);
- }
- public function moduleInfoErrorHandler($e:ModuleEvent):void{
- trace($e.errorText);
- }
- }
如上定義的moduleInfo在類中確實爲全局變量,但是我在頁面中引用的代碼卻是如下:
- <?xml version="1.0" encoding="utf-8"?>
- <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx" >
- <fx:Script>
- <![CDATA[
- protected function button1_clickHandler(event:MouseEvent):void
- {
- var load:TaskLoadModule=new TaskLoadModule();
- load.load("module/TestModule.swf",null);
- }
- ]]>
- </fx:Script>
- <s:Button x="205" y="0" label="按鈕" click="button1_clickHandler(event)" />
- </s:WindowedApplication>
這樣就出現了,在click事件執行完成後,TaskLoadModule也會被gc,相應的moduleInfo也被gc掉了,所以一直未觸發moduleInfo的Ready事件。