2010-05-05 62 views
2

問題:需要在運行時加載XML配置文件,並在應用程序的createChildren()被調用時做好準備。最遲,因爲需要配置值才能正確初始化子組件。最好,我希望在應用程序創建之前完成配置加載。總之,我想這樣做:如何在應用程序初始化之前在Flex中預加載文件

  1. 負載配置,然後
  2. 使用初始化加載的配置應用。

我創建了一個自定義預加載器來幫助解決這個問題。但事實證明,應用程序的createChildren()方法在預加載期間已經被調用,當配置尚未保證加載時。也就是說,在自定義預加載器調度COMPLETE事件之前。

感謝您提前提供任何幫助。

回答

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

最簡單的方法(我認爲)是創建一個「支架」的畫布的背景文件被加載後,將創建的應用程序的內容,即:

(僞代碼)

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> 
+0

我實際使用,作爲一個解決辦法,但想知道如果有一個更好的辦法。感謝您的建議。 – 2010-05-07 12:45:17

相關問題