1

我正在尝试使用加载进度条使应用程序窗口(Adobe Air)快速显示,直到加载了 windowedApplication 的所有组件。我尝试做的事情与 Adob​​e 默认为 Flex 所做的非常相似,但奇怪的是对 Air 没有。

我试图逃避我的应用程序在执行后启动的“空白 15 秒等待时间”。基本上,如果没有预加载器,它只会让用户感到非常困惑,因为单击应用程序图标后没有视觉响应(Windows 等)可能会导致用户尝试将其打开两次/三次以上。我只是想要一些让用户忙于预加载器/启动画面的东西。

Adobe 的网站上发布了类似的内容:- http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_07.html#172599

我查看了Adob​​e AIR - Custom Preloader with Image的答案

但是,这会导致以下问题,我在过去 15 天内没有找到解决方案:-

Adobe Air 中的用户登录验证和预加载器

示例项目 您可以通过我的 dropbox 帐户文件的链接下载示例项目:- https://www.dropbox.com/s/n43hdsmil6ox6js/preloader.fxp

该项目可以在 Flash builder 中打开(我使用的是 SDK 4.6,因此您可能需要更改应用程序描述符,以防您在不同的 sdk 版本上编译/运行)并运行它以获得登录屏幕。登录

用户密码

然后注意 UI/应用程序窗口如何变得无响应并停止响应 5-10 秒.. 即使 Alt+Tab 到窗口也不起作用!

它基本上没有任何逻辑数据 - 我只是确保有很多 UI 组件以增加 UI 创建时间。

我想要做的是让应用程序窗口继续响应并在模式对话框中显示进度/加载消息

4

1 回答 1

2

如果我正确理解了这个问题,听起来您需要的是构建一个Modular Application。这个想法是您在主应用程序中放置尽可能少的代码/资产,并简单地将其用作其余代码的入口点。我提供的链接应该涵盖所有细节,但这是基本思想:

我的应用程序.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>

我的模块.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 将尝试在单个更新中实例化堆栈中的每个视图,这几乎可以保证锁定线程。

这很可能足以满足您的用例,而不必乱用模块。

于 2013-09-09T16:24:42.460 回答