- 浏览: 300260 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
z390174504:
恩,确实,我也遇到了,好像是库冲突了,我在一个库项目中,单独引 ...
VerifyError: Error #1053: Illegal override of… -
cl1154781231:
您好,为什么使用tk-filter不用过滤*.gzip???我 ...
ExtJS使用gzip压缩 -
YY008871:
仅限ie下登录成功或失败吗?
单点登录—基于cookie的简单实现(IE) -
蛋的懒蛋:
不好用啊,IE7是运行了,但是就是一启动就报错了,接着就关了 ...
IE7绿色版下载-转载 -
fireinwind:
harman001 写道 ,为什么我的id大写同样没事啊!- ...
Spring配置文件中id的第二个字母不能大写问题
当程序越来越大,我们需要把它拆分成多个swf,在需要的时候动态加载。拆分时应该尽量把不同的类编译进唯一的swf,避免因swf文件增多而使整个程序的文件尺寸增大。按此原则可以拆分出以下两种swf,借助 ApplicationDomain 共享其代码和资源。
-
模块(Module)
按照程序逻辑,可以拆分出多个“功能模块”,如“注册”、“管理”等等;按照游戏或社区类程序的关卡或场景,可以拆分出不同的“场景模块”。这些模块不是主程序运行必须的,只在需要的时候加载。 -
运行时共享库(RSL)
主场景或者多个模块通用的资源,比如位图、声音、设计好的页面元素等,可作为“库”在主程序运行前加载。可以整套更换的皮肤(skin)只需先加载一套。
ApplicationDomain 是存放AS3定义(包括类、方法、接口等)的容器。使用Loader类加载swf时可以通过指定 ApplicationDomain 参数将swf加载到不同的域(Domain):
var context : LoaderContext = new LoaderContext();
/* 加载到子域(模块) */
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
/* 加载到同域(共享库) */
context.applicationDomain = ApplicationDomain.currentDomain;
/* 加载到新域(独立运行的程序或模块) */
context.applicationDomain = new ApplicationDomain();
loader.load(new URLRequest("loaded.swf"), context);
ApplicationDomain使用类似于显示列表(DisplayList)的树形结构。 相对于舞台(Stage) ,可以认为 ApplicationDomain 最根部的是系统域(system domain),包含 Flash Player 核心类定义。主程序所在的域(以下简称主域)就是它唯一的子域,类似于Stage下的文档类(Document Class)。
一个fla文档类里代码:
this.addChild(myMC);
this.addChild(myShape);
运行后的显示列表:
ApplicationDomain 的类似结构:
-
加载到子域(模块)
类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。 -
加载到同域(运行时共享库)
类似集合里的合并关系。被加载swf里的所有类定义被合并到当前域中可以直接使用。和加载到子域相同,和当前域同名的定义也会被忽略。 -
加载到新域(独立运行的程序或模块)
swf载入指定域之前,先要检查该域及其父域中是否存在同名类,重复定义一概忽略。如果加载别人写的程序,或者使用旧版本的主程序加载新版本的模块,为避免类名冲突就要加载到新域独立运行以使用自己的类。
模块加载到同域不是一样可以吗?为何要加载到子域呢?好处就在于,卸载一个加载到子域的模块时,只要确保清除所有到该模块的引用,模块的所有类定义将被垃圾回收(Garbage Collection)。
有两种方式可以访问 ApplicationDomain :
-
ApplicationDomain.currentDomain
currentDomain是ApplicationDomain的静态变量,表示当前代码所在的域。该变量很奇特,在主程序里指向主域,在加载到子域的模块里则指向该模块所在的子域。虽然 ApplicationDomain 有个 parentDomain 属性,但子域已经自动获得了父域的类定义,所以通过 ApplicationDomain.currentDomain 就可以获取父域定义了——包括主程序和加载到主域的共享库。(注:系统域不可直接访问,主域和所有新域即系统域子域的parentDomain属性为null) -
LoaderInfo类的applicationDomain属性
此方式可以访问任何方式加载的swf的 ApplicationDomain。对于主程序来说,加载到同域的库定义已经存在于 ApplicationDomain.currentDomain ,而模块的类主程序一般用不到。所以这种方式个人不推荐使用。
ApplicationDomain 的 hasDefinition() 方法判断某定义是否存在,getDefinition() 方法获取指定的定义。下面以一个 例子 来介绍 ApplicationDomain 的具体用法和应用程序的拆分。
本例 有四个swf,shell.swf是主程序,lib.swf是共享库,login.swf和result.swf分别是“登录”和“结果”模块,所有的视图元件都在共享库中。实际开发时可能有很多库,比如“位图库”、“音效库”、“模型通用库”等。“通用库”里存放多个模块共用的资源,比如此例中的背景元素。而各个模块独有的资源还是放在各自的swf中。
主程序首先将共享库加载到同域,完成后将“登录模块”加载到子域。主程序可以像操作普通的视觉对象(DisplayObject)一样操作加载的模块:监听事件、调用方法。因为编译器不会识别未定义的类,为使用强类型,建议为主类和模型定义相应的接口,使用少量的重复代码协助编程。
{
if (this.m_moduleList[0] == "login.swf")
{
p_module.show(this);
p_module.addEventListener("login", this.onLogin);
} else
{
p_module.show(this, this.m_userName);
}
}
模块“继承”了主程序和共享库的所有类和资源,可以通过 ApplicationDomain.currentDomain.getDefinition() 来获取相应的类。注意获取不存在的类会抛出一个 ReferenceError。
{
try
{
return ApplicationDomain.currentDomain.getDefinition(p_name) as Class;
} catch (p_e : ReferenceError)
{
trace("定义 " + p_name + " 不存在");
return null;
}
return null;
}
登录模块获取库中的界面元素,并在点击按钮后抛出事件。Event类不允许带参数,必须使用继承Event的自定义事件抛出参数。主程序可以把模块的自定义事件也编译进去(这样就增大了整个程序的文件尺寸),或者让监听模块事件的函数接受一个Objcet参数,以获取其动态属性。
{
this.m_userName = p_e.userName;
var login : IModule = p_e.currentTarget;
login.removeEventListener("login", this.onLogin);
login.dispose();
this.loadSwf();
}
主程序收到事件之后卸载注册模块,加载“结果模块”到子域,并将登录模块传出的”userName”参数传给结果模块。
{
var libClass : Class = this.getClass("net.eidiot.appDomainDemo.Libaray");
if (libClass != null) this.initUi(libClass, rest);
}
override protected function initUi(p_libClass : Class, p_rest : Array = null) : void
{
this.addUi(this.getClass(p_libClass.BG_NAME), "结果");
var resultFunc : Function = p_libClass.getResult;
var userName : String = p_rest[0];
this.addChild(resultFunc(userName));
}
注意initUi()方法分别使用了共享库中Libaray类的静态属性BG_NAME和静态方法getResult()。但是直接调用此静态方法会报错,可以先用 resultFunc 变量取出此方法。详细内容请参考附件;
转载自:http://www.duzengqiang.com/blog/post/283.html
发表评论
-
MBean with the same name could not be unregisted
2011-11-28 20:29 1079应用服务器:WebSphere 场景: flex通过Bla ... -
as3中正则表达式符号说明与使用
2011-09-28 13:45 1689元字符:^ $ \ . * + ? ( ) [ ] { } | ... -
FLEX 屏闭系统右键菜单,及在列表控件DataGrid/Tree/List上点右键时自动选择当前行
2011-09-05 17:56 1311第一步:到http://rightclickmanager ... -
“SecurityError: Error #2060: 安全沙箱冲突:ExternalInterface 调用者xxx不能访问xxx”解决方案一例
2011-06-27 14:01 2785SWF 文件不能被本地访 ... -
Flex中对swf文件的操作
2011-06-17 16:44 1541第一类: Flex中操作 fla格式或as格式文件生成的sw ... -
VerifyError: Error #1053: Illegal override of…
2011-06-16 10:53 2499I think some of you may encount ... -
VerifyError: Error #1053: Illegal override of removeChildBridge in mx.managers.S
2011-06-16 10:51 1487Ran into this error recently wh ... -
Flex builder的调试时需要flash player debug版本
2011-06-16 10:13 1685在adobe的网站上,有几种debug版本 http://w ... -
AS与JS相互通信(Flex中调用js函数)
2009-11-20 14:48 2146Flex中As调用Js的方法是: 1、导入包 (im ... -
Flex Timer 定时器
2009-10-15 13:46 3419flash.util.Timer类 flash. ... -
flex: 使用setInterval 制作定时器
2009-10-15 13:44 1734setInterval 函数是Action Script 的全 ... -
Flex的DateChooser组件中文显示方法
2009-09-10 09:17 1321Flex中的DateChooser组件,默认情况下是英文的。如 ... -
Cairngorm 中 AS版本的 Service 中注意的问题
2009-09-09 17:41 1173注意!本文所说的cairgorm版本是2.2.1 Cairn ... -
Cairngorm中使用remoteObect方式
2009-09-09 17:40 11191. 在Control中有Command.as定义了Comma ... -
flex显示sprite
2009-08-25 16:06 45551.sprite类可以在AS工程中直接绘制在屏幕上.2.要加到 ... -
表格列数动态确定
2008-09-04 11:16 975internal function onRetrieveT ... -
Flex与JavaScript的交互:调用JavaScipt或者被JavaScript调用
2008-09-04 10:32 1718一、在JavaScript中调用Fle ... -
Flex中的嵌入资源(Embedding Assets)
2008-09-01 11:52 6487Flex软件中经常需要使用一些外部的资源,如图片、声音、SWF ... -
PureMVC的十个小提示
2008-08-22 11:25 1483用(Pure)MVC的思想去思考 我应该如何开始使用(Pure ... -
flex与spring集成
2008-08-18 14:25 2534services-config.xml 定义spring fa ...
相关推荐
深入理解ApplicationDomain和SecurityDomain
applicationDomain学习资料
本书是一本教授ActionScript 2.0及开发丰富网络应用程序(Rich Internet Application, RIA)的指导书。内容围绕编程概念、ActionScript 2.0语法、使用组件快速创建应用程序、Flash与服务器连接、提取及更新数据库等...
ApplicationDomain的误解,安全沙箱有关内容
欢迎使用Excel和Visual Basic for Application开发应用程序!作为已经能够熟练使用Excell的用户,你一定对Excell强大的功能感到满意。现在,你将逐步提高到更高的水平。即使你以前从来没有编写过程序,也能够使用...
详细介绍ApplicationDomain和SecurityDomain的原理,想对这方面的知识做深入研究的可以看下
这个框架的初衷,是为了方便让程序模块化、插件化,将一个apk应用拆分为多个apk。 不明白这个插件化、模块化是怎么回事的话,可以看看腾讯微信的安卓客户端中的插件配置。 在这里我会以腾讯微信为例,如何使用这个...
教学提示: 掌握编写 Java Applet 程序和 Java Application 程序的基本方法; 了解程序的结构和 Java 语言的语法规则;理解事件驱动的工作原理;了解 DOS 界面程序和 J2ME 程序的特点和 设计方法。
教读者如何在Linux上设计,开发和部署实际的Java业务应用程序。
Linux Application Development(Linux应用程序开发)第二版和它的源代码
在HIS Demo中,我们使用了三个Microsoft Application Blocks,数据访问应用程序模块(Data Access Application Block, DAAB)、更新应用程序模块(Updater Application Block, UAB)以及异常管理应用程序模块...
VC6.0开发Win32Application程序,非常简单!
从MATLAB中创建出一个独立的应用程序有多种方法,可以用MATLAB提供的现有函数或者现有App,本文介绍的是利用MATLAB的Application Compiler工具创建一个独立的应用程序。
advanced-express-application-development, 高级 express web应用程序开发 高级 Express Web应用程序开发这里模块包含 above 图书的源代码。 请查看每个章节的自述文件以获得更多信息。第 1章:基础第 2章:构建 ...
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
应用程序调试技术 光盘 John Robbins Debugging Application
EXCEL VBA应用开发与实例精讲 作 者: 夏强 编著. 出 版 社: 科学出版社 出版时间: 2006-3-1 内容简介 VBA(Visual Basic for Applications)是Office 系列软件的内置编程语言,在Excel中使用VBA编程将会开发出...
和做事情一样,应用程序也需要有来有去。进来了,给用户提供良好的运用感受,帮用户顺利的解决问题。当然走的时候更需要带走自己遗留的“垃圾”,为再次使用或下一个用户提供干净的安全的系统环境。 如果应用程序走...
本书作为构建移动应用程序和云服务的实用向导,对于那些渴望利用云服务(例如Amazon Web Services)的强大能力作为支持,为移动设备创建跨平台应用程序的Web开发人员来说,是一本必不可少的读物。作者Richard Rodger一...
综合 Google App Engine 和 iPhone 开发的强大之处在于可以使用 Python 快速原型化应用程序的某些部分,在这之前用 Objective-C 进行编码十分繁琐,另外这种综合也增强了(在线和离线)数据存储的灵活性。...