本文和大家重点讨论一下FlexApplication初始化顺序,Flex组件在建立的时候都会经历四个事件:preinitialize, initialize, creationComplete和updateComplete,而FlexApplication初始化顺序是preloader->systemManager->FlexApplicationstarted。
FlexApplication初始化顺序
FlexApplication初始化顺序是preloader->systemManager->FlexApplicationstarted...
◆preinitialize
在所有的初始化之前触发,没有子组件的定义,但是可以引用组件的变量.
◆initialize
当所有子组件生成完成后触发,在这个时间点还没有组件被渲染出来.
◆reationComplete
组件定义完成并已经在显示列表.
◆applicationComplete
所有的组件初始化完成并显示.
首先介绍一下SystemManager.SystemManager是Flex应用的主控者,它控制着应用窗口,Application实例,弹出窗口,cursors,并管理着ApplicationDomain中的类.SystemManager是FlashPlayer实例化的***个类,它存储了主应用窗口的大小和位置信息,保存其子组件比如:浮动弹出窗口和模态窗口的痕迹.通过SystemManager可以获得内嵌字体,样式和document对象.
自定义的可视化组件(UIComponent的子类)只有在调用过addChild()后,才会有一个SystemManager赋给他们,之前是Null.所以在自定义可视化组件的构造函数中不要使用SystemManager.
Application对象创建时发生事件:
1.实例化Application对象
2.FlexApplication初始化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和少量工具类都在***帧,剩下的包括应用代码/内嵌资源全都在第二帧中.当FlashPlayer下载下载SWF时,只要接收到***帧内足够的数据,就会实例化SystemManager,由它来创建Preloader,然后创建DownloadProgressBar,这两个对象会察看剩余字节的传输过程.当***帧的所有字节传输完毕后,SystemManager发送enterFrame到第二帧,然后是其他事件.***Application对象派发applicationComplete事件.
Flex是一个事件驱动的编程模型,任何事情的发生,其背后必然存在一个事件.而开发者***次看到MXML时,很难体会到一个Xml标记的应用的事件流和实例化的生命周期.这个对于HTML和Flash的开发者尤其会感到困惑,因为其熟悉的方式与Flex的一点也不相似.HTML的实例化是从上到下的,Flash的执行是从Frame0开始一帧帧运行的.而Flex则又有不同.
从我们开始学习Flex时,我们就需要了解事件流和MXML的实例化.我非常困惑因为我实在难以理解什么样的事件会被触发或者事件什么时候会被触发.关键是要理解事件的基础并亲自观察事件流的初始化.
【编辑推荐】
- Flex 初始化时的事件测试
- Flex2.0Beta1新功能出炉
- 揭露Flex2.0的几大误区
- FlexBuilder3.0与Eclipse3.4的***结合
- 剖析Flex DataGrid分页控件的两种分页形式用法