Flex Application 初始化顺序

转载 2013年12月05日 13:23:27

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"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" 
  xmlns:mx="library://ns.adobe.com/flex/mx"
  preinitialize="report(event,'preinitialize')"
  initialize="report(event,'initialize')"
  creationComplete="report(event,'creationComplete')"
  applicationComplete="report(event,'applicationComplete')"
  >
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import flash.utils.getTimer;
[Bindable]
public var textData:String="";

public function report(event:Event,text:String):void{
textData+=String(flash.utils.getTimer())+'ms>>'
+event.currentTarget+'.'+text+'/n';
}
]]>
</fx:Script>

<s:TextArea
id="outTextArea"
text="{ textData }"
right="10" left="10" top="50" bottom="10" alpha="0.5"
initialize="report(event ,'initialize')"
creationComplete="report(event , 'creationComplete')"
/>

<s: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!' )"
/>

<s: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!' )"
/>

<s:Button
id="ClearButton"
label="Clear"
y="10" left="326" height="30" color="#000000" right="10"        
initialize="report( event , 'initialize' )"
creationComplete="report( event , 'creationComplete' )"
click="report( event , 'click' )"
/>

</s:WindowedApplication>

运行后没有点击按钮前显示的结果:

2508ms>>initialApplicationDemo0.preinitialize
2630ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.outTextArea.initialize
2637ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.HelloButton.initialize
2639ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.GoodByeButton.initialize
2640ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.ClearButton.initialize
2640ms>>initialApplicationDemo0.initialize
3064ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.GoodByeButton.creationComplete
3065ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.HelloButton.creationComplete
3065ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.outTextArea.creationComplete
3066ms>>initialApplicationDemo0.WindowedApplicationSkin2.Group3.contentGroup.ClearButton.creationComplete
3069ms>>initialApplicationDemo0.creationComplete
3075ms>>initialApplicationDemo0.applicationComplete

可以看出执行的顺序是 preinitialize——子组件的initialize——initialize——子组件的creationComplete——creationComplete——applicationComplete



Flex Application初始化顺序

Flex Application初始化顺序http://t-bones.blogbus.com/logs/37155737.html preloader->systemManager->FlexApp...
  • wgang777
  • wgang777
  • 2009年09月11日 10:05
  • 320

Flex Application 初始化顺序

preloader->systemManager->FlexApplication started... 然后才是 preinitialize 在所有的初始化之前触发,没有子组件的定义,但是...
  • gupeipei0912
  • gupeipei0912
  • 2013年08月27日 17:31
  • 269

Flex 程序的初始化顺序

Flex程序执行的过程中会触发preinitialize, initialize和creationComplete事件,还会创建静态成员变量和成员变量。它们的执行顺序时怎样的?Flex程序的执行顺序如...
  • songhuanren
  • songhuanren
  • 2007年05月24日 19:03
  • 3905

Flex中获取Application对象的方式

Flex应用程序中的根标签是 (Spark application容器),或 (MX Application容器)。application容器是所有Flex组件的根,就像HTML文档中的标签一样,所有...
  • miqi770
  • miqi770
  • 2014年11月17日 15:24
  • 1695

Flex Application各种属性解析

  • ystyaoshengting
  • ystyaoshengting
  • 2010年09月25日 19:18
  • 1646

Flex Application 初始化事件的顺序

Flex Application 初始化事件的顺序 (1)首先测试下单个Application的初始化事件的顺序 顺序如下: preinitialize 在组件初始化序列开始时调度。在这个事件...
  • sebastain
  • sebastain
  • 2012年10月08日 17:55
  • 1721

Flex Application初始化顺序:pre ->init ->creat->app

preloader->systemManager->FlexApplication started... 然后才是 preinitialize 在所有的初始化之前触发,没有子组件的定...
  • w938706428
  • w938706428
  • 2015年06月24日 11:58
  • 263

flex 学习笔记之 Application与子component交互的两个方法

先贴代码:  1. Application http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*">  import mx.co...
  • adriano86426
  • adriano86426
  • 2009年02月27日 22:45
  • 2054

Flex 3: mx:Application.applicationComplete vs creationComplete &&Flex Application 初始化顺序

preloader->systemManager->FlexApplication started…然后才是preinitialize在所有的初始化之前触发,没有子组件的定义,但是可以引用组件的变量....
  • yijishashou
  • yijishashou
  • 2010年04月08日 18:21
  • 696

Flex 3: mx:Application.applicationComplete vs creationComplete &&Flex Application 初始化顺序

preloader->systemManager->FlexApplication started…然后才是preinitialize在所有的初始化之前触发,没有子组件的定义,但是可以引用组件的变量....
  • my0041
  • my0041
  • 2009年12月01日 12:25
  • 1178
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Flex Application 初始化顺序
举报原因:
原因补充:

(最多只允许输入30个字)