当前位置: 首页 > 编程日记 > 正文

【转】Flex Application 初始化顺序

转自:http://www.jexchen.com
大家都知道,我们在编写Flex应用程序时,通常是以<mx:Application>标签作为开头,实际上,Flex应用程序在启动运行的时候并不是直接从Application开始运行,在这之前还有一部分悄悄的先运行了,正如大家所看到的,当我们运行编写好的Flex应用程序时,尽管我们没有编写任何与启动进度载入条相关的代码,但无一例外的,应用程序均会为我们自动加上这一部分。因此才有我们看到的如下图所示的标准的Flex loading载入条。

4d65c19et628bbd7c8471

通常我们所说的Flex应用程序,本质上来说是基于Flex框架、采用ActionScript 3.0编写的Flash应用程序,从这一点来说,它和普通的Flash应用程序没有任何差别。相对来说,传统的使用Flash IDE(如Flash CS3)创建Flash程序时更多的基于“时间线”(Timeline)及“帧”(Frame)的概念,更易于设计师理解;而基于Flex框架来创建的 Flash应用程序更多是强调程序性,很少提及“时间线”与“帧”的概念,更易于程序员理解。其实Flex应用程序一样也有时间线,只是这部分由Flex 框架隐藏起来了,通常不为大家所熟悉,在默认创建Flex程序时,这一切Flex已帮我们完成了,但了解这部分内容更有助于大家对Flex应用程序的启动有更深刻的认识,以便能对程序更灵活的控制与发挥~~

4d65c19et628bb55d6a89

我们来看看上面这幅示意图,Flex应用程序共由两帧组成,第1帧为preloader部分,第2帧为主应用程序部分,此两部分由Flex应用程序的根SystemManager统管,SystemManager是flash.display.MovieClip的子类,影片剪辑(movie clip)支持帧。由于swf属于一种渐进式(progressive)下载的格式,正是由于swf格式这个特性,Flash Player并不需要等待整个程序下载完成便可直接访问已载入帧的内容,因此第一帧通常用来作为应用程序载入时的loading画面显示,一般来说,第一帧包含的内容应该尽可能的少(在第一帧中尽量不要含有Flex框架的组件),以便能很快的下载并立即显示;第二帧才是主应用程序真正的内容,一旦 SystemManager实例进入到第二帧后,即开始内部主应用程序运行的生命周期(life cycle),也就是进入我们最为熟悉的<mx:Application>运行的部分(SystemManger实例有一 application的属性,在第1帧时,此属性为null,当进入到第2帧时,该属性才指向真正的主程序application实例)记住我们开始所说的,Flex应用程序总的来说是以事件驱动的程序

在程序进入第2帧,主程序application开始运行后,便会相应的触发相应的一系列事件,按事件发生的先后顺序依次来介绍:

preinitialize

应用程序application已实例化,但此时还未创建任何相关的孩子组件(child component)

initialize

此时,创建了相应的孩子组件,但还未对这些子组件进行布局

creationComplete

应用程序application完成全部实例化,并完成所有子组件的布局

apllicationComplete

上面三处事件的完成,表明application内部启动的整个进程完成,接下来便会通知SystemManager派发applicationComplete事件。此时,启动程序启动完成并准备运行。

Flash包含的是一个时间线上的多个帧, 而Flex的SWF只包含2个帧. SystemManager, Preloader, DownloadProgressBar和少量工具类都在第一帧, 剩下的包括应用代码/ 内嵌资源全都在第二帧中. 当Flash Player下载下载SWF时, 只要接收到第一帧内足够的数据, 就会实例化SystemManager, 由它来创建Preloader, 然后创建DownloadProgressBar, 这两个对象会察看剩余字节的传输过程. 当第一帧的所有字节传输完毕后, SystemManager发送enterFrame到第二帧, 然后是其他事件. 最后Application对象派发applicationComplete事件.
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函数中, 主要是从性能方面考虑.
Flex 是一个事件驱动的编程模型, 任何事情的发生, 其背后必然存在一个事件. 而开发者第一次看到MXML时, 很难体会到一个Xml标记的应用的事件流和实例化的生命周期. 这个对于HTML和Flash的开发者尤其会感到困惑, 因为其熟悉的方式与Flex的一点也不相似. HTML的实例化是从上到下的, Flash的执行是从Frame0开始一帧帧运行的. 而Flex则又有不同.
我们来看一个简单的MXML的应用.
1. <?xml version="1.0" encoding="utf-8"?> 
2. <mx:Application 
3.  xmlns:mx="http://www.adobe.com/2006/mxml" 
4.  layout="absolute" 
5.  backgroundGradientColors="[#67cbff, #fcffff]" 
6.  color="#000000" 
7.  fontSize="12" 
8.  preinitialize="report( event , 'preinitialize' )" 
9.  initialize="report( event , 'initialize' )" 
10.  creationComplete="report( event , 'creationComplete' )" 
11.  applicationComplete="report( event , 'applicationComplete' )" 
12.  > 
13. 
14.  <mx:Script> 
15.  <![CDATA[ 
16. 
17.  [Bindable] 
18. 
19.  public var outTextData:String=""; 
20. 
21.  public function report( event:Event , value:String ):void 
22.  { 
23.  outTextData += String( flash.utils.getTimer() ) + 'ms >> ' 
24.  + event.currentTarget + '.' + value + '\n'; 
25.  } 
26. 
27.  ]]> 
28.  </mx:Script> 
29. 
30.  <mx:TextArea 
31.  id="outTextArea" 
32.  text="{ outTextData }" 
33.  right="10" left="10" top="50" bottom="10" alpha="0.5" 
34.  wordWrap="false" 
35.  initialize="report( event , 'initialize' )" 
36.  creationComplete="report( event , 'creationComplete' )" 
37.  /> 
38. 
39.  <mx:Button 
40.  y="10" height="30" left="168" width="150" 
41.  id="HelloButton" 
42.  label="Say Hello" 
43.  initialize="report( event , 'initialize' )" 
44.  creationComplete="report( event , 'creationComplete' )" 
45.  rollOver="report( event , 'rollOver' )" 
46.  rollOut="report( event , 'rollOut' )" 
47.  click="report( event , 'click > Hello!' )" 
48.  /> 
49. 
50.  <mx:Button 
51.  id="GoodByeButton" 
52.  label="Say Goodbye" 
53.  y="10" left="10" height="30" width="150" color="#000000" 
54.  initialize="report( event , 'initialize' )" 
55.  creationComplete="report( event , 'creationComplete' )" 
56.  click="report( event , 'click > Goodbye!' )" 
57.  /> 
58. 
59.  <mx:Button 
60.  id="ClearButton" 
61.  label="Clear" 
62.  y="10" left="326" height="30" color="#000000" right="10" 
63.  initialize="report( event , 'initialize' )" 
64.  creationComplete="report( event , 'creationComplete' )" 
65.  click="outTextData='';report( event , 'click' )" 
66.  /> 
67. 
68. </mx:Application> 
这个应用运行时, 输出了实例流程和事件流. 这校我们就能够看到所有事件的触发顺序. 可以发现应用启动后, 事件的顺序是一定的. 下面是输出的内容:
1. 167ms >> EventFlow0.preinitialize 
2. 183ms >> EventFlow0.outTextArea.initialize 
3. 187ms >> EventFlow0.HelloButton.initialize 
4. 188ms >> EventFlow0.GoodByeButton.initialize 
5. 189ms >> EventFlow0.ClearButton.initialize 
6. 189ms >> EventFlow0.initialize 
7. 243ms >> EventFlow0.outTextArea.creationComplete 
8. 243ms >> EventFlow0.HelloButton.creationComplete 
9. 243ms >> EventFlow0.GoodByeButton.creationComplete 
10. 244ms >> EventFlow0.ClearButton.creationComplete 
11. 244ms >> EventFlow0.creationComplete 
12. 246ms >> EventFlow0.applicationComplete 
13. 一旦applicationComplete事件触发后, 组件就会在鼠标事件派发后触发自己的事件. 
14. 1807ms >> EventFlow0.HelloButton.rollOver 
15. 2596ms >> EventFlow0.HelloButton.rollOut 
16. 2954ms >> EventFlow0.HelloButton.rollOver 
17. 3170ms >> EventFlow0.HelloButton.rollOut 
18. 3543ms >> EventFlow0.HelloButton.rollOver 
19. 4052ms >> EventFlow0.HelloButton.click > Hello! 
20. 4267ms >> EventFlow0.HelloButton.click > Hello! 
21. 4474ms >> EventFlow0.HelloButton.click > Hello! 
22. 4569ms >> EventFlow0.HelloButton.rollOut 
23. 4907ms >> EventFlow0.GoodByeButton.click > Goodbye! 
24. 5130ms >> EventFlow0.GoodByeButton.click > Goodbye!

转载于:https://www.cnblogs.com/AndySong/archive/2009/05/17/1458576.html

相关文章:

Matlab编程与数据类型 -- 分支条件选择语句if/end

本微信图文详细介绍了Matlab中if/end分支条件选择语句。

插槽 查看硬盘状态_摄影路上的“全能”伴侣 | LaCie DJI Copilot 移动硬盘

照片的安全是摄影人不得不考虑的问题&#xff0c;尤其是长时间外出拍摄时&#xff0c;一旦出现意外&#xff0c;比如存储卡损坏或丢失&#xff0c;那么千辛万苦拍摄的照片将付之东流&#xff0c;造成无法挽回的损失。虽然意外发生的概率并不高&#xff0c;但是为了保险起见&…

【转载】C语言变量详解

原链接&#xff1a;http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html 刚做题时发现全局变量会自动初始化&#xff0c;如int型则自动初始化为0&#xff0c;double则初始化为0.000000....。而局部变量如果没有初始化的话&#xff0c;初值为一随机数。于是…

Matlab编程与数据类型 -- 多分支条件选择语句if/elseif/…/else/end

本微信图文详细介绍了Matlab中if/elseif/…/else/end多分支条件选择语句。

图解c/c++多级指针与“多维”数组

2019独角兽企业重金招聘Python工程师标准>>> 前言 指针与数组是C/C编程中非常重要的元素&#xff0c;同时也是较难以理解的。其中&#xff0c;多级指针与“多维”数组更是让很多人云里雾里&#xff0c;其实&#xff0c;只要掌握一定的方法&#xff0c;理解多级指针和…

信科c语言实验程序修改题_豆瓣评分 9.3,史上最好的 C 语言著作,竟然翻车了.........

上周&#xff0c;在小编的各种努力下(省略一万字)&#xff0c;Kindle 官方终于答应给我一个广告位了。虽然只是开机屏&#xff0c;但我还是笑出了猪叫&#xff0c;毕竟上一次有这待遇还是 2018 年时的《算法图解》。所以错过了上次&#xff0c;这次我一定要亲眼见证这个时刻。我…

Nodejs Express dockerfile最佳实践

少啰嗦&#xff0c;先看代码 package.json {"name": "xxx","version": "0.0.0","private": true,"scripts": {"start": "node ./bin/www","forever": "node_modules/forever/…

Matlab编程与数据类型 -- 开关语句switch/end

本微信图文详细介绍了Matlab中switch/end开关语句。

安装ATi显卡驱动后增加的鼠标右键菜单的清理

一般最直接的方法是&#xff1a;一般位于注册表的&#xff1a;删除注册表HKEY_CLASSES_ROOT\Directory \Background\shellex\ContextMenuHandlers\ACE下 ab默认{5E2121EE-0300-11D4-8D3B-444553540000}办法一&#xff1a;刚才有朋友询问了ATi显卡在安装CATALYST Control Center…

15crmo焊接后多长时间探伤_15CrMo十五铬钼属于合金钢?、下面来解释一下

15CrMo十五铬钼属于合金钢​&#xff0c;主要用于石油、石化、高压锅炉等&#xff0c;专门用途的无缝管有锅炉用无缝管、地质用无缝钢管及石油用无缝管等多种。​一、15CrMo化学成分&#xff1a;C:0.12-0.18 Mn&#xff1a;0.40-0.70 Si&#xff1a;0.17-0.37 Cr&#xff1a;0.…

VTL-vm模板的变量用法

加载foot模块页 #parse("foot.vm") #foreach($item in $tables) #set($strEnd $item.Length - 1) #set($sheetName $item.Substring(0, $strEnd)) <option value"$item">$sheetName</option> #end $strEnd也可以看做一个字符串来操作 $it…

百度云磁盘CDS、对象存储BOS技术深度解析

在BAT中&#xff0c;百度在公有云也有很多技术创新。比如2013年引起广泛关注的ARM存储服务器就是一个很好的例子。最近两年&#xff0c;百度云开始发力&#xff0c;其云存储体系有诸多创新之处。目前百度云存储形成了以块存储、对象存储、文件存储为核心&#xff0c;VPN/专线、…

Matlab编程与数据类型 -- 出错处理语句try/catch/end

本微信图文详细介绍了Matlab中try/catch/end出错处理语句。

linux设置nexus开机自启动_在linux中使用nexus搭建maven私服

首先介绍下为什么要搭建maven私服&#xff0c;简单点说就是就是把项目工程中的Jar包放在一个服务器上&#xff0c;每次Jar包的修改都能去私服上面Down到本地。可以对整个项目组的人形成一个统一的管理。2、下载完之后就是这个了&#xff1a;我这个是目前最新的版本了&#xff0…

Lintcode42 Maximum Subarray II solution 题解

【题目描述】Given an array of integers, find two non-overlapping subarrays which have the largest sum.The number in each subarray should be contiguous.Return the largest sum.Notice:The subarray should contain at least one number给定一个整数数组&#xff0c;…

const用法详解

面向对象是C的重要特性. 但是c在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i5; int j0; ... ij; //非法&#xff0c;导致编译错误 ji; //合法 2. 必…

Matlab编程与数据类型 -- continue、break和return语句

本微信图文详细介绍了Matlab中的continue、break和return语句。

mysql 修复_修复崩溃的Mysql

在mysql的配置文件my.cnf里找到 [mysqld]字段下&#xff0c;添加 innodb_force_recovery 1如果innodb_force_recovery 1不生效&#xff0c;则可尝试2——6几个数字然后重启mysql&#xff0c;重启成功。然后使用mysqldump或 pma 导出数据&#xff0c;执行修复操作等。修复完成…

window.open(url?param=+paramvalue) 服务端 乱码问题解决

window.open("url?param"paramvalue)传递参数出现乱码&#xff0c;在客房端显示是正常的&#xff0c;可是到服务端就是乱码。 1. 利用一个js在客户端转码的函数&#xff0c;escape(str);但是传到服务端仍然是乱码&#xff0c;所以必须在服务端进行解码。 2. 服务端执…

Matlab编程与数据类型 -- 数据类型概述

本微信图文详细介绍了Matlab中的数据类型&#xff0c;数值型和逻辑型举例介绍&#xff0c;其它类型在相应图文进行介绍。

初识mysql数据字段属性_初识mysql

# 经典sql语句 创建数据库- CREATE DATABASE database_name; 删除数据库- DROP DATABASE database_name; 创建备份数据库- USE masterEXEC sp_addupdevice disk,testBack ,c:\xxx\xxx.dat 开始备份- BACKUP DATABASE pubs TO testBack;--- 创建表- 创建新表 create table tab_n…

ceph存储引擎bluestore解析

原文链接&#xff1a;http://www.sysnote.org/2016/08/19/ceph-bluestore/ ceph后端支持多种存储引擎&#xff0c;以插件式的方式来进行管理使用&#xff0c;目前支持filestore&#xff0c;kvstore&#xff0c;memstore以及最新的bluestore&#xff0c;目前默认使用的filestor…

Matlab编程与数据类型 -- 字符型数组

本微信图文详细介绍了Matlab中的字符串类型。

最近想做个音乐共享的软件

准备分如下几部分&#xff1a; 1.配置文件xml读写 2.播放器部分&#xff1a;开始准备用mediaplay做&#xff0c;发现有个开源的播放器&#xff0c;可以考虑 3.网络部分&#xff1a;主要是种子搜索和更新 准备召唤有兴趣的达人一起开发转载于:https://www.cnblogs.com/donneymin…

精通mysql_《深入精通Mysql(五)》实战:Mysql实现主从复制

深入精通Mysql系列其他文章推荐&#xff1a;一、前言随着应用业务数据不断的增大&#xff0c;应用的响应速度不断下降&#xff0c;在检测过程中我们不难发现大多数的请求都是查询操作。此时&#xff0c;我们可以将数据库扩展成主从复制模式&#xff0c;将读操作和写操作分离开来…

一个开发团队、软件公司,团队工作氛围很重要,没有好氛围难出好产品、好项目...

接触软件行业很多年有些年头了&#xff0c;展望过去的岁月&#xff0c;总想写点儿东西&#xff0c;总结总结&#xff0c;我也不怕拍砖了&#xff0c;曾经也换过很多公司、跳过很多槽&#xff0c;现在想想&#xff0c;总结出来&#xff1a;“天下的乌鸦是一样黑的”&#xff0c;…

Matlab编程与数据类型 -- 奇数阶魔方矩阵的编程

本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程。

Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

2019独角兽企业重金招聘Python工程师标准>>> 本文节选自《Netkiller Database 手札》 第 63 章 Apache Hive 目录 63.1. 安装 Apache Hive 63.1.1. MySQL 63.1.2. Hadoop 63.1.3. Hive 63.1.4. 启动 Hive 63.1.5. 访问 Hive 63.2. 管理 Hive 63.2.1. 表管理 63.2.1.…

mysql的profile_Mysql分析-profile详解

一。前言当我们要对某一条sql的性能进行分析时&#xff0c;可以使用它。Profiling是从 mysql5.0.3版本以后才开放的。启动profile之后&#xff0c;所有查询包括错误的语句都会记录在内。关闭会话或者set profiling0 就关闭了。(如果将profiling_history_size参数设置为0&#x…

2003網域升級到2008網域以及遷移DNS

2003網域升級到2008網域以及遷移DNS 如圖這是我們現在的拓撲&#xff0c;cc從現用的LCS2008網域升級到2008網域&#xff0c;並一步步截圖給大家示範說明。隨便抓了臺虛擬機&#xff0c;是以前做LCS試驗用的&#xff0c;現在不用了&#xff0c;正好給大家示範2003升級到2008網域…