加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex的运行机制详解

发布时间:2020-12-15 04:35:12 所属栏目:百科 来源:网络整理
导读:Flex程序从本质上讲,就是使用了(由AS编写的)Flex框架的Flash程序。 但在Flex程序中可以忽略timeline这个概念,所有的内容都集于一

Flex程序从本质上讲,就是使用了(由AS编写的)Flex框架的Flash程序。

但在Flex程序中可以忽略timeline这个概念,所有的内容都集于一帧。
事实上Flex程序中的根,是继承flash.display.MovieClip的mx.managers.SystemManager。

SystemManager有两帧。第一帧是预加载程序,第二帧是主程序。

因此,所有程序在真正开始运行前,需要经过如下过程:

预初始(preinitialize)
??? 程序在这个过程后,已经被实例化,但还未创建任何内容。
初始化(initialize)
??? 程序在这个过程后,已创建好内容,但还未完成布局。
创建完成(creationComplete)
??? 程序在这个过程后,已完成包括布局在内的所有创建。

在顺利完成以上3个过程后,SystemManager广播applicationComplete事件,意味着程序整装待发了。

SystemManager还管理着所有显示在前端的内容。包括弹出窗,鼠标指针,工具提示等。

SystemManager 有一个叫totelLevelSystemManager的属性。当Flex程序是一个独立程序时,该属性指向SystemManager的实例,而当 Flex程序是被加载到别的Flex程序时,该属性指向加载者的SystemManager实例。

所有UIComponents都有一个systemManager的属性,指向程序的SystemManager实例。

了解预加载器?
预加载器由SystemManager在第一帧自动创建,当完成后发布complete事件,并进入第二帧,再由SystemManager删除。
除了complete以外,还有如下事件:
progress:程序下载过程
rslError:运行期共享库下载失败
rslProgress:运行期共享库下载过程
rslComplete:运行期共享库下载完成
initProgress:程序初始化过程
initComplete:程序初始化完成

在Flex程序中加载另一个Flex程序?
被加载的Flex程序,在加载完毕后,自身内部会经历上述3个过程。最终,主程序才能对该程序进行有效的访问。

?<!-- ------------------------------------
???? B.mxml 生成 B.swf
?-------------------------------------- -->?
?<? xml version="1.0" encoding="utf-8" ?>?
?< mx:Application? xmlns:mx ="http://www.adobe.com/2006/mxml"? layout ="absolute" >?
????? < mx:Script >?
????????? <![CDATA[?
???????????? public function setBackground(color:Number):void {
???????????????? canvas.setStyle("backgroundColor",color);
???????????? }
????????? ]]>?
????? </ mx:Script >?
????? < mx:Canvas? id ="canvas"? backgroundColor ="#FFFFFF"? width ="100"? height ="100"?? />
?</ mx:Application >?
?
?<!-- ------------------------------------
???? A.mxml 生成 A.swf 加载 B.swf
?-------------------------------------- -->?
?<? xml version="1.0" encoding="utf-8" ?>?
?< mx:Application? xmlns:mx ="http://www.adobe.com/2006/mxml"? layout ="absolute" >?
????? < mx:Script >?
????????? <![CDATA[?
???????????? import mx.managers.SystemManager;
???????????? import mx.events.FlexEvent;
?
???????????? private function initHandler(event:Event):void {
???????????????? event.target.content.addEventListener(FlexEvent.APPLICATION_COMPLETE,applicationCompleteHandler);
???????????? }
?
???????????? private function applicationCompleteHandler(event:Event):void {
???????????????? event.target.application.setBackground(0xFFFF00);
???????????? }
????? ]]>?
????? </ mx:Script >?
????? < mx:SWFLoader? source ="B.swf"? init ="initHandler(event)"?? />?
?</ mx:Application >?
?

了解程序作用域?
当程序中牵涉到加载外部.swf程序时,了解程序作用域的概念是非常重要的。

首先要了解所有的Flex/Flash程序都是由一系列类组合而成。这一系列类都维持在一个程序作用域中。当仅有一个程序在运行时,程序作用域的概念只是一个形式,因为不可能发生作用域冲突的事情。当加载额外的.swf程序后,情况就不一样了,此时,可能会发生3种情况:
被加载的.swf在现有作用域的子作用域中运行?
??? 这种情况下,被加载.swf可以使用父作用域中的所有类,而本身作用域中和父作用域中冲突的类,将被忽视。
??? 这样子有3个好处:
??????? 减少内存的占用。?
??????? 单态管理者(Singleton manager classes)可以访问父级程序,也可以访问子级程序。?
??????? 从技术角度讲,在编译子级程序时,可以不用把重复的类编译进去,从而减少文件大小?
??? 但有时不能忽视子作用域的类。比如碰到类名虽然冲突,但功能却不相同时。
被加载的.swf在一个新的完全独立的作用域中运行?
??? 这种情况下,被加载.swf在一个不受任何约束的作用域中运行。虽然不会发生什么冲突,但这样会加大内存的占用。
被加载的.swf在现有作用域中运行?
??? 这种情况下,被加载.swf在现有的作用域中运行,被看作现有内容的一部分。常常用于运行期共享库。

实现上述3种情况的代码如下:


?

?// ------------------------------------------------------------
?//???? 被加载的.swf在现有作用域的子作用域中运行
?// ------------------------------------------------------------?
?var context:LoaderContext? =?? new? LoaderContext();
?context.applicationDomain? =?? new? ApplicationDomain(ApplicationDomain.currentDomain);
?var request:URLRequest? =?? new? URLRequest( " RuntimeLoadingExample.swf " );
?var loader:Loader? =?? new? Loader();
?loader.load(request,context);
?//? 等同于?
?var request:URLRequest? =?? new? URLRequest( " RuntimeLoadingExample.swf " );
?var loader:Loader? =?? new? Loader();
?loader.load(request);
?
?// ------------------------------------------------------------
?//???? 被加载的.swf在一个新的完全独立的作用域中运行
?// ------------------------------------------------------------?
?var context:LoaderContext? =?? new? LoaderContext();
?context.applicationDomain? =?? new? ApplicationDomain();
?var request:URLRequest? =?? new? URLRequest( " RuntimeLoadingExample.swf " );
?var loader:Loader? =?? new? Loader();
?loader.load(request,context);
?
?// ------------------------------------------------------------
?//???? 被加载的.swf在现有作用域中运行
?// ------------------------------------------------------------?
?var context:LoaderContext? =?? new? LoaderContext();
?context.applicationDomain? =? ApplicationDomain.currentDomain;
?var request:URLRequest? =?? new? URLRequest( " RuntimeLoadingExample.swf " );
?var loader:Loader? =?? new? Loader();
?loader.load(request,context);

loadContext?
ApplicationDomain

Flash Player和Flex框架的不同?
Flash Player是Flash/Flex程序的运行环境。它用来运行.swf文件,完成加载图片,绘制图像,请求HTTP等之类的操作。Flash/Flex程序只能做Flash Player能够做的事情。

Flex程序就是Flash程序,Flash不能做的事情,Flex一样不能做。所以程序包含的只不过是具体指令,而Flash Player则是运行指令。Flash程序和Flex程序在内容上没有不同,只是在创建内容时不同。

Flex的编译器可以编译MXML和AS。由AS和MXML编写的Flex框架抽象出一个更高级的层面。这些都能在Flash Player中运行。 改善的是开发速度。 负面影响则是增加了.swf的大小。因为Flex框架是要被具体编译到.swf里面的,而不像Flash Player API已经集成在Flash Player内部了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读