如何在应用程序初始化之前在Flex中预加载文件

时间:2010-05-05 13:32:03

标签: flex preload

问题:需要在运行时加载XML配置文件,并在调用应用程序的createChildren()时准备好。最迟,因为需要配置值才能正确初始化子组件。最好,我希望在应用程序创建之前完成配置加载。简而言之,我想这样做:

  1. 加载配置,然后
  2. 使用加载的配置初始化应用程序。
  3. 我创建了一个自定义预加载器来帮助解决这个问题。但事实证明,当预配置尚未保证加载时,应用程序的createChildren()方法已经在预加载时被调用。也就是说,在自定义预加载器调度COMPLETE事件之前。

    感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:3)

我找到了问题的解决方案。关键是捕获预加载器的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">

答案 1 :(得分:1)

最简单的方法(我认为)是创建一个'holder'画布,它将在加载上下文文件后创建应用程序内容,即:

(伪代码)

Application.mxml:

<mx:Canvas>
   <mx:Script>
      public function init():void{
          loadXML();
      }

      public function handleXMLLoaded():void{
          this.addChild(myApplicationContent);
      }
   </mx:Script>
</mx:Canvas>

MyApplicationContent.mxml

<mx:Canvas>
<!-- contains all your components etc -->
</mx:Canvas>