- 浏览: 131543 次
- 性别:
- 来自: 济南
文章分类
最新评论
preloader->systemManager->FlexApplication started…
然后才是
preinitialize
在所有的初始化之前触发,没有子组件的定义,但是可以引用组件的变量.
initialize
当所有子组件生成完成后触发,在这个时间点还没有组件被渲染出来.
creationComplete
组件定义完成并已经在显示列表.
applicationComplete
所有的组件初始化完成并显示.
首 先介绍一下SystemManager. SystemManager是Flex应用的主控者, 它控制着应用窗口, Application实例, 弹出窗口, cursors, 并管理着ApplicationDomain中的类. SystemManager是FlashPlayer实例化的第一个类, 它存储了主应用窗口的大小和位置信息, 保存其子组件比如:浮动弹出窗口和模态窗口的痕迹. 通过SystemManager可以获得内嵌字体,样式和document对象.
自定义的可视化组件(UIComponent的子类)只有在调用过addChild()后, 才会有一个SystemManager赋给他们, 之前是Null. 所以在自定义可视化组件的构造函数中不要使用SystemManager.
通常, Application对象创建时, 发生如下事件:
1. 实例化Application对象
2. 初始化Application.systemManager
3. Application在初始化过程之前, 派发预初始化事件.
4. 调用createChild(). 此时, 所有应用组件被创建, 所有组件的createChild()被调用.
5. Application派发初始化事件, 表明所有的组件初始化完毕.
6. 派发creationComplete事件
7. Application对象添加到显示列表中
8. 派发applicationComplete事件
大 多数情况下, 我们使用<mx:Application>来创建application对象, 但如果使用ActionScript来创建的话, 那么建议不要在application的构造函数中创建组件, 推荐在crateChildren函数中, 主要是从性能方面考虑.
Flash包含的是一个时间线上的多个帧, 而Flex的SWF只包含2个帧. SystemManager, Preloader, DownloadProgressBar和少量工具类都在第一帧, 剩下的包括应用代码/ 内嵌资源全都在第二帧中. 当Flash Player下载下载SWF时, 只要接收到第一帧内足够的数据, 就会实例化SystemManager, 由它来创建Preloader, 然后创建DownloadProgressBar, 这两个对象会察看剩余字节的传输过程. 当第一帧的所有字节传输完毕后, SystemManager发送enterFrame到第二帧, 然后是其他事件. 最后Application对象派发applicationComplete事件.
Flex 是一个事件驱动的编程模型, 任何事情的发生, 其背后必然存在一个事件. 而开发者第一次看到MXML时, 很难体会到一个Xml标记的应用的事件流和实例化的生命周期. 这个对于HTML和Flash的开发者尤其会感到困惑, 因为其熟悉的方式与Flex的一点也不相似. HTML的实例化是从上到下的, Flash的执行是从Frame0开始一帧帧运行的. 而Flex则又有不同.
从我们开始学习Flex时, 我们就需要了解事件流和MXML的实例化. 我非常困惑因为我实在难以理解什么样的事件会被触发或者事件什么时候会被触发. 关键是要理解事件的基础并亲自观察事件流的初始化.
我们来看一个简单的MXML的应用.
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application
xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”absolute”
backgroundGradientColors=”[#67cbff, #fcffff]”
color=”#000000″
fontSize=”12″
preinitialize=”report( event , ‘preinitialize’ )”
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
applicationComplete=”report( event , ‘applicationComplete’ )”
>
<mx:Script>
<![CDATA[
[Bindable]
public var outTextData:String=”";
public function report( event:Event , value:String ):void
{
outTextData += String( flash.utils.getTimer() ) + ‘ms >> ‘
+ event.currentTarget + ‘.’ + value + ‘\n’;
}
]]>
</mx:Script>
<mx:TextArea
id=”outTextArea”
text=”{ outTextData }”
right=”10″ left=”10″ top=”50″ bottom=”10″ alpha=”0.5″
wordWrap=”false”
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
/>
<mx:Button
y=”10″ height=”30″ left=”168″ width=”150″
id=”HelloButton”
label=”Say Hello”
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
rollOver=”report( event , ‘rollOver’ )”
rollOut=”report( event , ‘rollOut’ )”
click=”report( event , ‘click > Hello!’ )”
/>
<mx:Button
id=”GoodByeButton”
label=”Say Goodbye”
y=”10″ left=”10″ height=”30″ width=”150″ color=”#000000″
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
click=”report( event , ‘click > Goodbye!’ )”
/>
<mx:Button
id=”ClearButton”
label=”Clear”
y=”10″ left=”326″ height=”30″ color=”#000000″ right=”10″
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
click=”outTextData=”;report( event , ‘click’ )”
/>
</mx:Application>
这个应用运行时, 输出了实例流程和事件流. 这校我们就能够看到所有事件的触发顺序. 可以发现应用启动后, 事件的顺序是一定的. 下面是输出的内容:
167ms >> EventFlow0.preinitialize
183ms >> EventFlow0.outTextArea.initialize
187ms >> EventFlow0.HelloButton.initialize
188ms >> EventFlow0.GoodByeButton.initialize
189ms >> EventFlow0.ClearButton.initialize
189ms >> EventFlow0.initialize
243ms >> EventFlow0.outTextArea.creationComplete
243ms >> EventFlow0.HelloButton.creationComplete
243ms >> EventFlow0.GoodByeButton.creationComplete
244ms >> EventFlow0.ClearButton.creationComplete
244ms >> EventFlow0.creationComplete
246ms >> EventFlow0.applicationComplete
一旦applicationComplete事件触发后, 组件就会在鼠标事件派发后触发自己的事件.
1807ms >> EventFlow0.HelloButton.rollOver
2596ms >> EventFlow0.HelloButton.rollOut
2954ms >> EventFlow0.HelloButton.rollOver
3170ms >> EventFlow0.HelloButton.rollOut
3543ms >> EventFlow0.HelloButton.rollOver
4052ms >> EventFlow0.HelloButton.click > Hello!
4267ms >> EventFlow0.HelloButton.click > Hello!
4474ms >> EventFlow0.HelloButton.click > Hello!
4569ms >> EventFlow0.HelloButton.rollOut
4907ms >> EventFlow0.GoodByeButton.click > Goodbye!
5130ms >> EventFlow0.GoodByeButton.click > Goodbye!
关于creationComplete事件的发生时机,手册中是这样说的:
假设程序中有这样的结构:
Application
OuterVBox
InnerVBox1
InnerVBoxLabel1
InnerVBox2
InnerVBoxLabel2
事件:preinitialize, initialize, creationComplete发生的顺序是这样的:
OuterVBox preinitialize
InnerVBox1 preinitialize
InnerVBox1Label preinitialize
InnerVBox1Label initialize
InnerVBox1 initialize
InnerVBox2 preinitialize
InnerVBox2Label preinitialize
InnerVBox2Label initialize
InnerVBox2 initialize
OuterVBox initialize
InnerBox1Label creationComplete
InnerVBox2Label creationComplete
InnerVBox1 creationComplete
InnerVBox2 creationComplete
OuterVBox creationComplete
所有的initialization事件完成后,creationComplete时间才开始发生,先从叶子控件开始,然后是他们的父控件,直到application。
如果将 OuterVBox容器变成ViewStack并且creationPolicy 属性为auto, 则事件发生顺序是:
OuterViewStack preinitialize
InnerVBox1 preinitialize
InnerVBox2 preinitialize
OuterViewStack initialize
InnerBox1Label preinitialize
InnerBox1Label initialize
InnerVBox1 initialize
InnerBox1Label creationComplete
InnerVBox1 creationComplete
OuterViewStack creationComplete
然而,对于item renderer 或者 item editor, Flex 可能会重用item renderer 或者item editor的实例。但是被重用的renderer 或者item editor的实例不会再次发生creationComplete事件。作为替代,你可以使用dataChange事件。Flex 会在每次data属性发生变化时触发dataChange事件。在Accessing the listData property(Flex2 help中)一节中的例子就使用了dataChange事件来更新在DataGrid控件的item renderer中的TextArea的内容。
然后才是
preinitialize
在所有的初始化之前触发,没有子组件的定义,但是可以引用组件的变量.
initialize
当所有子组件生成完成后触发,在这个时间点还没有组件被渲染出来.
creationComplete
组件定义完成并已经在显示列表.
applicationComplete
所有的组件初始化完成并显示.
首 先介绍一下SystemManager. SystemManager是Flex应用的主控者, 它控制着应用窗口, Application实例, 弹出窗口, cursors, 并管理着ApplicationDomain中的类. SystemManager是FlashPlayer实例化的第一个类, 它存储了主应用窗口的大小和位置信息, 保存其子组件比如:浮动弹出窗口和模态窗口的痕迹. 通过SystemManager可以获得内嵌字体,样式和document对象.
自定义的可视化组件(UIComponent的子类)只有在调用过addChild()后, 才会有一个SystemManager赋给他们, 之前是Null. 所以在自定义可视化组件的构造函数中不要使用SystemManager.
通常, Application对象创建时, 发生如下事件:
1. 实例化Application对象
2. 初始化Application.systemManager
3. Application在初始化过程之前, 派发预初始化事件.
4. 调用createChild(). 此时, 所有应用组件被创建, 所有组件的createChild()被调用.
5. Application派发初始化事件, 表明所有的组件初始化完毕.
6. 派发creationComplete事件
7. Application对象添加到显示列表中
8. 派发applicationComplete事件
大 多数情况下, 我们使用<mx:Application>来创建application对象, 但如果使用ActionScript来创建的话, 那么建议不要在application的构造函数中创建组件, 推荐在crateChildren函数中, 主要是从性能方面考虑.
Flash包含的是一个时间线上的多个帧, 而Flex的SWF只包含2个帧. SystemManager, Preloader, DownloadProgressBar和少量工具类都在第一帧, 剩下的包括应用代码/ 内嵌资源全都在第二帧中. 当Flash Player下载下载SWF时, 只要接收到第一帧内足够的数据, 就会实例化SystemManager, 由它来创建Preloader, 然后创建DownloadProgressBar, 这两个对象会察看剩余字节的传输过程. 当第一帧的所有字节传输完毕后, SystemManager发送enterFrame到第二帧, 然后是其他事件. 最后Application对象派发applicationComplete事件.
Flex 是一个事件驱动的编程模型, 任何事情的发生, 其背后必然存在一个事件. 而开发者第一次看到MXML时, 很难体会到一个Xml标记的应用的事件流和实例化的生命周期. 这个对于HTML和Flash的开发者尤其会感到困惑, 因为其熟悉的方式与Flex的一点也不相似. HTML的实例化是从上到下的, Flash的执行是从Frame0开始一帧帧运行的. 而Flex则又有不同.
从我们开始学习Flex时, 我们就需要了解事件流和MXML的实例化. 我非常困惑因为我实在难以理解什么样的事件会被触发或者事件什么时候会被触发. 关键是要理解事件的基础并亲自观察事件流的初始化.
我们来看一个简单的MXML的应用.
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application
xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”absolute”
backgroundGradientColors=”[#67cbff, #fcffff]”
color=”#000000″
fontSize=”12″
preinitialize=”report( event , ‘preinitialize’ )”
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
applicationComplete=”report( event , ‘applicationComplete’ )”
>
<mx:Script>
<![CDATA[
[Bindable]
public var outTextData:String=”";
public function report( event:Event , value:String ):void
{
outTextData += String( flash.utils.getTimer() ) + ‘ms >> ‘
+ event.currentTarget + ‘.’ + value + ‘\n’;
}
]]>
</mx:Script>
<mx:TextArea
id=”outTextArea”
text=”{ outTextData }”
right=”10″ left=”10″ top=”50″ bottom=”10″ alpha=”0.5″
wordWrap=”false”
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
/>
<mx:Button
y=”10″ height=”30″ left=”168″ width=”150″
id=”HelloButton”
label=”Say Hello”
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
rollOver=”report( event , ‘rollOver’ )”
rollOut=”report( event , ‘rollOut’ )”
click=”report( event , ‘click > Hello!’ )”
/>
<mx:Button
id=”GoodByeButton”
label=”Say Goodbye”
y=”10″ left=”10″ height=”30″ width=”150″ color=”#000000″
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
click=”report( event , ‘click > Goodbye!’ )”
/>
<mx:Button
id=”ClearButton”
label=”Clear”
y=”10″ left=”326″ height=”30″ color=”#000000″ right=”10″
initialize=”report( event , ‘initialize’ )”
creationComplete=”report( event , ‘creationComplete’ )”
click=”outTextData=”;report( event , ‘click’ )”
/>
</mx:Application>
这个应用运行时, 输出了实例流程和事件流. 这校我们就能够看到所有事件的触发顺序. 可以发现应用启动后, 事件的顺序是一定的. 下面是输出的内容:
167ms >> EventFlow0.preinitialize
183ms >> EventFlow0.outTextArea.initialize
187ms >> EventFlow0.HelloButton.initialize
188ms >> EventFlow0.GoodByeButton.initialize
189ms >> EventFlow0.ClearButton.initialize
189ms >> EventFlow0.initialize
243ms >> EventFlow0.outTextArea.creationComplete
243ms >> EventFlow0.HelloButton.creationComplete
243ms >> EventFlow0.GoodByeButton.creationComplete
244ms >> EventFlow0.ClearButton.creationComplete
244ms >> EventFlow0.creationComplete
246ms >> EventFlow0.applicationComplete
一旦applicationComplete事件触发后, 组件就会在鼠标事件派发后触发自己的事件.
1807ms >> EventFlow0.HelloButton.rollOver
2596ms >> EventFlow0.HelloButton.rollOut
2954ms >> EventFlow0.HelloButton.rollOver
3170ms >> EventFlow0.HelloButton.rollOut
3543ms >> EventFlow0.HelloButton.rollOver
4052ms >> EventFlow0.HelloButton.click > Hello!
4267ms >> EventFlow0.HelloButton.click > Hello!
4474ms >> EventFlow0.HelloButton.click > Hello!
4569ms >> EventFlow0.HelloButton.rollOut
4907ms >> EventFlow0.GoodByeButton.click > Goodbye!
5130ms >> EventFlow0.GoodByeButton.click > Goodbye!
关于creationComplete事件的发生时机,手册中是这样说的:
假设程序中有这样的结构:
Application
OuterVBox
InnerVBox1
InnerVBoxLabel1
InnerVBox2
InnerVBoxLabel2
事件:preinitialize, initialize, creationComplete发生的顺序是这样的:
OuterVBox preinitialize
InnerVBox1 preinitialize
InnerVBox1Label preinitialize
InnerVBox1Label initialize
InnerVBox1 initialize
InnerVBox2 preinitialize
InnerVBox2Label preinitialize
InnerVBox2Label initialize
InnerVBox2 initialize
OuterVBox initialize
InnerBox1Label creationComplete
InnerVBox2Label creationComplete
InnerVBox1 creationComplete
InnerVBox2 creationComplete
OuterVBox creationComplete
所有的initialization事件完成后,creationComplete时间才开始发生,先从叶子控件开始,然后是他们的父控件,直到application。
如果将 OuterVBox容器变成ViewStack并且creationPolicy 属性为auto, 则事件发生顺序是:
OuterViewStack preinitialize
InnerVBox1 preinitialize
InnerVBox2 preinitialize
OuterViewStack initialize
InnerBox1Label preinitialize
InnerBox1Label initialize
InnerVBox1 initialize
InnerBox1Label creationComplete
InnerVBox1 creationComplete
OuterViewStack creationComplete
然而,对于item renderer 或者 item editor, Flex 可能会重用item renderer 或者item editor的实例。但是被重用的renderer 或者item editor的实例不会再次发生creationComplete事件。作为替代,你可以使用dataChange事件。Flex 会在每次data属性发生变化时触发dataChange事件。在Accessing the listData property(Flex2 help中)一节中的例子就使用了dataChange事件来更新在DataGrid控件的item renderer中的TextArea的内容。
发表评论
-
Flex:使用@Embed嵌入元素
2010-08-04 16:57 1107可以在Flex应用程序中嵌入各种元素。被嵌入的元素将编译进SW ... -
连续滚动的图片效果
2010-01-25 14:37 1585思路是,把超出视觉范围 ... -
Flex PureMVC实例教程
2009-12-18 00:01 4280摘自: http://blog.csdn.net/ ... -
as3强大的正则表达式:RegExp
2009-12-04 15:20 956摘自: http://www.okp ... -
FLEX 3 新特性 (个人无责任猜想版)
2009-11-07 21:32 943http://www.unbuzz.com/blogs/ind ... -
Flex设置ToolTip样式
2009-10-25 13:33 1343StyleManager.getStyleDeclaratio ... -
谈谈Flex中ArrayCollection的复制(克隆)
2009-05-19 14:44 1238在Flex的开发过程中,常常会遇到复制ArrayC ... -
Flex-DataGrid使用关键字过滤结果
2009-04-23 17:02 971这里主要展示如何使用搜索的关键字过滤DataGri ... -
你有所不知的HTML发布Flash的参数(一):allowScriptAccess
2009-04-13 10:22 1339摘自: http://www.luar.com.hk/flas ... -
firefox下js与flash通讯的可恶
2009-04-12 16:56 799http://www.laaan.cn/?p=682 -
flex creationComplete事件的一些思考
2009-03-29 21:39 1460creationComplete恐怕是flex ... -
flex初始化时的事件测试
2009-03-29 21:31 887flex组件在建立的时候都会经历四个事件:preinitial ... -
Flex locale ResourceBundle的使用
2009-03-25 15:47 3037ResourceBundle的使用 新建文件夹(Loca ... -
RangeError: Error #2006: 提供的索引超出范围
2009-03-18 11:18 3364如果你使用了PopUpManager.addPopUp添加弹出 ... -
TabNavigator使用心得
2009-03-17 10:58 1858做了一个控件很长时间,一直有两个问题困扰我。 1. ... -
Flex 数据绑定技巧
2009-03-16 21:19 826有一种简单的方法可以 ... -
Flex 程序的初始化顺序
2009-03-16 21:11 860Flex程序执行的过程中会触发 preinitialize, ... -
Flex启动过程分析
2009-03-16 21:02 802首先介绍一下SystemManager. SystemMana ... -
Flex的crossdomain.xml问题
2009-03-09 13:04 3518玩过Flex或者Flash的同学都知道,如果想要在Flash里 ... -
FLEX内存优化
2009-03-06 13:17 928FLEX内存释放优化原则: ...
相关推荐
`Android-AppInitializer`是一个专门为了解决这个问题而设计的库,它允许开发者在`Application`启动时按需执行不同子模块的初始化代码,避免了在主`Application`类中堆积大量初始化逻辑,从而提高了代码的可读性和可...
Flex Application 初始化顺序是一个重要的概念,尤其对于开发Adobe Flex应用程序的开发者来说,理解这一流程能帮助他们更好地优化代码和管理应用程序的生命周期。Flex是基于ActionScript和MXML的框架,用于构建富...
1. **ECU Boot Sequence** (电子控制单元启动顺序) ECU的启动过程涉及到Bootloader和Application的交互。当ECU上电或复位时,通常会首先执行Bootloader,它负责初始化硬件、检查系统状态,并根据需要决定是否加载新...
部署过程中,需要指定应用的上下文根、模块类型(如WAR、EAR)、部署顺序以及相关的资源文件。 2. **应用生命周期管理**:包括安装、启动、停止、卸载和更新等操作。例如,通过管理控制台可以轻松地启动或停止应用...
3. **启动脚本(`.boot`)**:指定启动应用时的初始状态,包括启动哪些进程及其顺序。 4. **配置文件(`.config`)**:可选,用于存放应用的配置参数。 在"bank3"这个例子中,我们可以假设它是一个简单的银行应用...
使其应用启动时加载ProxyApplication,然后在其中实现加载dex等一些流程处理。 在替换Application的过程中,应该注意以下几点: 1. 创建RealApplication,维护正常的生命周期,并进行回调。 2. 对应用中屏蔽掉...
在JBoss应用服务器中,管理和控制应用的启动顺序是一个关键任务,特别是在大型的企业级系统中,各个组件和服务的启动优先级直接影响到整个系统的稳定性和功能完整性。标题提及的"解决jboss中启动的优先级的问题"是...
开发者需要理解这些方法的执行顺序和场景,以便有效管理资源。 2. **文件名关联**: - 提供的文件名称列表(test1到test8)可能对应于应用中的不同模块或者测试用例。在Android开发中,通常会为每个功能或组件创建...
Spring Boot加载配置文件的顺序是:`properties` > `yaml` > `xml`。如果存在多个相同名称但不同格式的配置文件,`yml`文件可能会被`properties`文件覆盖。确保没有其他配置文件意外地覆盖了`application.yml`。 9...
本文将深入探讨 application.properties 文件的配置格式、加载顺序、自定义配置文件位置、文件名问题、普通的属性注入等知识点。 配置文件格式 在 Spring Boot 中,配置文件有两种不同的格式,一种是 properties,...
标题“运行JavaApplication”指的是在Java环境中启动一个应用程序的过程。这个过程涉及到多个关键知识点,包括Java开发环境的配置、类加载机制、主方法以及程序执行流程。以下是对这些概念的详细解释: 1. **Java...
七、Spring Boot 配置文件优先级Spring Boot 支持多种配置文件(application.properties 或 application.yml),它们的加载顺序为:1. `application-${profile}.properties/yml` (当前激活 profile 的配置)2. `...
通过"ServiceApplication"这个项目,你可以学习到如何在实际应用中创建、启动、绑定服务,以及如何处理服务的生命周期和通信。同时,实践是检验理论的最好方式,通过运行和调试代码,你会对Service有更深刻的理解,...
ApplicationRunner接口用于执行应用程序启动时的操作,而CommandLineRunner接口用于执行命令行参数的操作。 在实现事件监听时,需要注意事件的触发顺序和执行时机,以免出现错误和问题。同时,事件监听也可以用于...
1. **安装和启动**:下载并安装WAS,启动程序后,用户可以看到一个简单的界面,包含各种配置选项。 2. **创建测试计划**:定义要测试的URL,可以是单个页面或整个网站,也可以导入已有的HTTP日志文件。 3. **设置...
理解这些生命周期方法的调用顺序和使用场景,是掌握Android开发的关键。 9. **意图(Intent)**: Intent是Android中实现组件间通信的主要方式,可以用来启动Activity或Service。在`MyApplication`中,我们可能看到...
在Windows 7环境下,BCDEDIT被广泛用于处理多系统启动菜单的问题,比如添加、删除或修改启动项,调整启动顺序,解决启动故障等。** **一、BCDEDIT的基本用法** BCDEDIT命令行工具可以通过运行“bcdedit.exe”来调用...
本篇文章将从《UIQ3_Whitepaper_01_Start_Application_Framework》中提取关键知识点,并对其进行详细解释,帮助读者更好地理解如何在UIQ3平台上启动应用框架。 #### 二、目标读者与预备知识 本白皮书的目标读者为...