如 http://archive.cnblogs.com/a/2234982/ 所说, 在使用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事件。
记下错误,以便以后不再出这样的笑话