2010-05-05 3 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

Я фактически использовал это в качестве временного решения, но хотел бы знать, если есть лучший способ. Спасибо за ваше предложение. –

Смежные вопросы