2013-09-09 2 views
1

Я пытаюсь быстро открыть окно приложения (Adobe Air) с индикатором выполнения загрузки до тех пор, пока не будут загружены все компоненты windowedApplication. То, что я пытаюсь сделать, очень похоже на то, что Adobe делает для Flex по умолчанию, но странно не для Air.Индикатор выполнения загрузки Adobe AIR при инициализации

Что я пытаюсь избежать «незаполненного 15-секундного времени ожидания», которое мое приложение принимает, чтобы начать после его выполнения. В принципе, если нет прелоадера, он просто вводит пользователя в заблуждение, поскольку визуальный ответ (окна и т. Д.) После нажатия на значок приложения может привести к тому, что пользователь попытается открыть его дважды/три раза больше раз. Я просто хочу что-то, что заставляет пользователя загружаться с предустановочным/заставным экраном.

Нечто подобное размещен на веб-сайте компании Adobe: - http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_07.html#172599

Я посмотрел на ответы на Adobe AIR - Custom Preloader with Image

Однако, что вызывает следующую проблему, к которой я не нашел решение в прошлом 15 дней: -

User Login validation and preloader in Adobe Air

Пример проекта Вы можете скачать образец проекта, перейдя по ссылке на файл моего аккаунта системы: - https://www.dropbox.com/s/n43hdsmil6ox6js/preloader.fxp

Проект может быть открыт в Flash Builder (я использовал SDK 4.6, так что вы, возможно, придется изменить дескриптор приложения в случае, если вы компилируете/работает на другой версии SDK) и запустить его, чтобы получить экран входа в систему .. Вход с

пользователя/пароль

и обратите внимание на то, как окно UI/приложение перестает отвечать на запросы и перестает отвечать на 5-10 секунд .. Даже Alt + Tab в окно не будет работать!

В основном он не имеет логических данных внутри - я просто убедился, что у меня много компонентов интерфейса, чтобы увеличить время создания пользовательского интерфейса.

То, что я пытаюсь сделать, а не для окна приложения, чтобы продолжать реагировать и иметь сообщение прогресс/загрузки в модальный диалог

ответ

2

Если я правильно понял вопрос правильно, это звучит как то, что вам нужно, это построить Modular Application. Идея заключается в том, что вы поместите как можно меньше кода/активов в основное приложение и просто используйте его как точку входа в остальную часть вашего кода. Ссылку я предоставил должен охватывать все детали, но вот основная идея:

MyApplication.mxml

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" 
         xmlns:s="library://ns.adobe.com/flex/spark"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 

      protected function login_clickHandler(event:MouseEvent):void 
      { 
       trace("login_clickHandler(event)"); 

       this.moduleLoader.url = "MyModule.swf"; 
       this.moduleLoader.loadModule(); 

       this.currentState = "loading"; 

      } 

      protected function moduleLoader_updateCompleteHandler(event:FlexEvent):void 
      { 
       trace("moduleLoader_updateCompleteHandler(event)"); 

       this.moduleLoader.removeEventListener(FlexEvent.UPDATE_COMPLETE, moduleLoader_updateCompleteHandler); 
       this.currentState = "ready"; 
      } 
     ]]> 
    </fx:Script> 

    <s:states> 
     <s:State name="login" /> 
     <s:State name="loading" /> 
     <s:State name="ready" /> 
    </s:states> 

    <s:ModuleLoader id="moduleLoader" top="0" left="0" bottom="0" right="0" 
        updateComplete="moduleLoader_updateCompleteHandler(event)" /> 

    <s:Button label="Login" horizontalCenter="0" verticalCenter="0" includeIn="login" click="login_clickHandler(event)" /> 

    <mx:ProgressBar id="progressBar" source="{this.moduleLoader}" horizontalCenter="0" verticalCenter="0" 
        includeIn="loading" /> 

</s:WindowedApplication> 

MyModule.mxml

<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" 
      xmlns:s="library://ns.adobe.com/flex/spark" width="100%" height="100%" 
      creationComplete="module1_creationCompleteHandler(event)"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 

      /** 
      * Let's embed a video to simulate load time.. 
      */ 
      [Embed(source = "VID_20130603_212046.mp4", mimeType = "audio/mpeg")] 
      private static const VIDEO_SOURCE:Class; 

      protected function module1_creationCompleteHandler(event:FlexEvent):void 
      { 
       trace("MyModule.module1_creationCompleteHandler(event)"); 

      } 
     ]]> 
    </fx:Script> 

    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <s:Panel top="40" left="40" bottom="40" right="40"> 

     <s:Label text="Hello World" horizontalCenter="0" verticalCenter="0" /> 

    </s:Panel> 

</s:Module> 

Это будет держать запуск время для основного окна приложения до минимума и дать вам точку входа до загрузки всех тяжелых ресурсов.

UPDATE

Посмотрев на примере проекта в вашем обновлении, вам нужно просто установить creationPolicy = «авто» в вашем ViewStack, а не «все». Установка его для всех будет пытаться создать экземпляр каждого представления в стеке за одно обновление, которое почти гарантировано заблокирует поток.

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

+0

ok .. я могу понять, что индикатор выполнения отображается с состоянием загрузки. Как мы переходим к следующему состоянию «готовы» и просматриваем MyModule? Полное завершение обновления модуля ModuleLoader будет запущено сразу, даже если кнопка входа в систему не была нажата, поскольку компонент включен в представление/состояние. – Rohan

+0

Я добавил ссылку на образец проекта и обновил вопрос, который объясняет проблему более четко. Пожалуйста, посмотрите, можете ли вы понять выход – Rohan

+0

@Rohan см. Мои обновления RE: ваш пример приложения – drkstr1