我正在尝试使用加载进度条快速显示应用程序窗口(Adobe Air),直到加载了windowedApplication的所有组件。我试图做的是与Adobe默认为Flex做的非常相似的事情,但奇怪的是不适用于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构建器中打开项目(我使用的是SDK 4.6,因此您可能必须更改应用程序描述符,以防您在不同的sdk版本上进行编译/运行)并运行它以获取登录屏幕。登录与
用户/密码
然后注意UI /应用程序窗口如何无响应并停止响应5-10秒 ..即使Alt + Tab到窗口也不起作用!
它基本上没有任何逻辑数据 - 我只是确保有很多UI组件,以便增加UI创建时间。
我要做的是让应用程序窗口继续响应,并在模态对话框中显示进度/加载消息
答案 0 :(得分: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>
这将使主应用程序窗口的启动时间降至最低,并在加载所有重型资源之前为您提供一个入口点。
<强>更新强>
在查看更新中的示例项目后,您只需在ViewStack中设置creationPolicy =“auto”,而不是“all”。将其设置为all将尝试在单个更新中实例化堆栈中的每个视图,这几乎可以保证锁定线程。
这很可能对你的用例来说已经足够了,而不必乱用模块。