Как предварительно загрузить файл в Flex перед инициализацией приложения

Проблема: файл конфигурации XML должен быть загружен во время выполнения и быть готовым к вызову createChildren () приложения. Самое позднее, поскольку значения конфигурации необходимы для правильной инициализации дочерних компонентов. Желательно, чтобы загрузка конфигурации была завершена до того, как приложение будет создано. Короче я хочу сделать вот что:

  1. загрузить конфигурацию, затем
  2. инициализировать приложение, используя загруженную конфигурацию.

Я создал специальный предварительный загрузчик, чтобы решить эту проблему. Но, как оказалось, метод createChildren () приложения уже вызывается во время предварительной загрузки, когда загрузка конфигурации еще не гарантирована. То есть до того, как пользовательский предварительный загрузчик отправит событие COMPLETE.

Спасибо за любую помощь заранее.


person JK.    schedule 05.05.2010    source источник


Ответы (2)


Нашел решение проблемы. Ключ состоял в том, чтобы перехватить событие 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">
person JK.    schedule 07.05.2010

Самый простой способ (я думаю) - создать холст «держателя», который будет создавать контент приложения после загрузки файла контекста, то есть:

(псевдокод)

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>
person quoo    schedule 05.05.2010
comment
На самом деле я использовал это как обходной путь, но хотел знать, есть ли способ лучше. Спасибо за ваше предложение. - person JK.; 07.05.2010