ApplicationDomain顾名思义是应用程序域的意思,domain就是域名的意思,有点儿墨迹了,但我觉得对于某些人来说还是有必要一提的;那么AS3中为什么要引进域的概念呢?
以及这概念有什么应用呢?下面我说一下自己的浅见。
众所周知,现在的项目开发基本上都是flash builder 与 flash cs配合使用来完成的,而之所以二者能配合起来是需要桥梁的,这个纽带就是swf和swc文件。
那么,必然flash builder也要把这两种文件加载进来为己所用,但问题就出现在这里,加载进来的swf or swc(swf + xml)放到哪里呢?需不需要考虑安全性呢?怎么放置这些文件才能方便管理呢?一系列的问题(猜想)最后有了答案,出现了类似于下图的格局:
那么,当swf or swc被加载进来后默认会放到C域,那我们有没有办法控制让他放到B0域或者B1域呢?当然有;这些都是可以控制的,由谁控制呢?注意下面这段文字:
urlloader类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据。 在下载文本文 件、XML 或其它用于动态数据驱动应用程序的信息时,它很有用.
loader类可用于加载 SWF 文件或图像(JPG、PNG 或 GIF)文件。 使用 load() 方法来启动加载。 被加载的显示对象将作为 Loader 对象的子级添加。
这回我们知道了swf or swc是loader类加载进来的,注意下面的一段话:
loader 加载进来的swf or swc文件的所有定义都存储在loadercontext的applicationdomain属性所指定的应用程序域中。
这回我们明白了,这个控制者就是loadercontext的applicationdomain属性。具体的将swf or swc指定到某个域的方式如下:
1. |
var urlRequest:URLRequest = new URLRequest(url); |
2. |
var loader:Loader = new Loader(); |
3. |
var context:LoaderContext = new LoaderContext(); |
4. |
|
5. |
context.applicationDomain = ApplicationDomain.currentDomain;//当前域 |
6. |
|
7. |
//context.applicationDomain = new ApplicationDomain(); 新应用程序域 |
8. |
|
9. |
// context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);当前域子域(默认) |
10. |
loader.load(urlRequest, context); |
当加载完成后我们可以像这样来使用加载的类定义
1. |
|
2. |
var AClass:Class = loader.contentLoaderInfo.applicationDomain.getDeFinition(ClassDeFinitionName) as Class; |
3. |
new AClass(); |
由浅入深理解的效果会更好。
下面就说说这三个不同的域
1、当前域
ApplicationDomain 类的用途是存储 ActionScript 3.0 定义表,在当前域中加载类定义后,如果当前域中已经有了同名的类定义,那么新加载的类定义不会覆盖原来的(这一点要注意),原来没有的会添加到as3的定义表中。
这可让您将新的类定义添加到应用程序的当前一组类定义中。这可用于主应用程序的运行时共享库。加载的 SWF 被视为远程共享库 (RSL)。使用此方法可以在应用程序启动之前使用预加载器加载 RSL。
2、新应用程序域
在系统域中新建一个应用程序域,他和当前域是平级的。这样我们可以对相同名称的类,可以有两个完全不同的定义。
此方法的一个用处是使旧版应用程序能够动态加载相同应用程序的更新版本,而不会发生冲突。之所以不发生冲突,是因为尽管使用的是同样的类名称,但它们划分到不同的应用程序域中。
3、当前域子域
在当前域中新建一个子域。这里也有一个要注意的,就是当父级域中(也就是当前域)没有同名的定义时,子域中的类才会被定义。
此方法的一个用处可能是作为一个使用主应用程序的类型的多屏幕丰富 Internet 应用程序 (RIA) 模块,该模块作为主应用程序的子级加载。如果能够确保所有类始终更新为向后兼容,并且正在加载的应用程序始终比其加载的软件的版本新,则子级将使用父级版本。如果可以确保不继续拥有对子级 SWF 的引用,则拥有了新的应用程序域还使您能够卸载所有的类定义以便于垃圾回收。此方法使加载的模块可以共享加载者的 singleton 对象和静态类成员。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。