问题:需要在运行时加载 XML 配置文件,并在调用应用程序的 createChildren() 时准备好。最迟,因为需要配置值来正确初始化子组件。最好在创建应用程序之前完成配置加载。简而言之,我想这样做:
- 加载配置,然后
- 使用加载的配置初始化应用程序。
我创建了一个自定义预加载器来帮助解决这个问题。但事实证明,应用程序的 createChildren() 方法已经在预加载期间被调用,此时配置还不能保证被加载。也就是说,在自定义预加载器调度 COMPLETE 事件之前。
感谢您提前提供任何帮助。
问题:需要在运行时加载 XML 配置文件,并在调用应用程序的 createChildren() 时准备好。最迟,因为需要配置值来正确初始化子组件。最好在创建应用程序之前完成配置加载。简而言之,我想这样做:
我创建了一个自定义预加载器来帮助解决这个问题。但事实证明,应用程序的 createChildren() 方法已经在预加载期间被调用,此时配置还不能保证被加载。也就是说,在自定义预加载器调度 COMPLETE 事件之前。
感谢您提前提供任何帮助。
我找到了解决问题的方法。关键是捕获预加载器的 FlexEvent.INIT_PROGRESS 事件,对其进行排队,并停止其传播,直到配置完全加载。这有效地阻止了框架继续进行应用程序初始化。配置加载后,重新调度排队的事件,让框架完成预加载阶段。下面的示例代码(仅相关部分):
public class PreloaderDisplay extends Sprite implements IPreloaderDisplay {
// mx.preloaders.IPreloaderDisplay interface
public function set preloader(preloader:Sprite):void {
// max priority to ensure we catch this event first
preloader.addEventListener(FlexEvent.INIT_PROGRESS, onInitProgress, false, int.MAX_VALUE);
startLoadingConfiguration();
}
private function onInitProgress(e:FlexEvent):void {
if (isConfigurationLoading) {
queuePreloaderEvent(e);
e.stopImmediatePropagation();
}
}
private function onConfigurationLoaded():void {
dispatchQueuedPreloaderEvents();
}
}
要在应用程序中使用它:
<mx:Application preloader="the.package.of.PreloaderDisplay">
最简单的方法(我认为)是创建一个“持有人”画布,它将在加载上下文文件后创建应用程序内容,即:
(伪代码)
应用程序.mxml:
<mx:Canvas>
<mx:Script>
public function init():void{
loadXML();
}
public function handleXMLLoaded():void{
this.addChild(myApplicationContent);
}
</mx:Script>
</mx:Canvas>
我的应用程序内容.mxml
<mx:Canvas>
<!-- contains all your components etc -->
</mx:Canvas>