Flex多SWF文件加载之Applicatoin Domain

本文详细介绍了在加载外部SWF文件时如何利用应用程序域(ApplicationDomain)实现类定义的隔离和共享,包括独立域、共享域及子域的概念及其具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要
当我们加载外部swf时,必须要了解应用程序域(Application Domain)。从Adobe官方文件中,我们可以得知应用程序域能够把处于同一个安全域(Security Domain)中的类分离开,这样就可以让一个类的多个定义共存,或是让多个子应用来共享父应用的类定义。简单点理解就是应用程序域为类定义提供了分区功能。

应用程序域
一个类的多个定义共存:内存中有多个类,它们名称相同,但定义不同定义,由于处于不同的应用程序域,所以互不干扰,得以共存。

子应用共享父应用的类定义:N个子应用引用同一个父应用的所提供的类定义,当父应用更新时,子应用所引用的内容也会随之更新。

当加载外部swf文件时,可以为其设置三种应用程序域:

一、将加载的swf指定至一个既存的应用程序域中。

二、将加载的swf指定为一个既存的应用程序域的子应用程序域。

三、为加载的swf指定一个全新的应用程序域。

我们先来看一下官方文档的说明图:

图中共有四个文件,分别为application1.swf、module1.swf、application2.swf和module3.swf。module1.swf、application2.swf和module3.swf均被application1.swf加载,其中module1.swf与application1.swf属于同一个域,module3.swf被划分至application1.swf的子应用程序域,最后是application2.swf,它完全拥有一个独立的应用程序域。

独立域,在应用定义相同的情况下,可以使几个版本并行

view plaincopy to clipboardprint?
01.var appDomainA:ApplicationDomain = new ApplicationDomain();  
02.var contextA:LoaderContext = new LoaderContext(false, appDomainA);  
03.var loaderA:Loader = new Loader();  
04.loaderA.load(new URLRequest("application2.swf"), contextA); 
var appDomainA:ApplicationDomain = new ApplicationDomain();
var contextA:LoaderContext = new LoaderContext(false, appDomainA);
var loaderA:Loader = new Loader();
loaderA.load(new URLRequest("application2.swf"), contextA);

共享域,增加新的类定义(RSL)

view plaincopy to clipboardprint?
01.var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain;  
02.var contextB:LoaderContext = new LoaderContext(false, appDomainB);  
03.var loaderB:Loader = new Loader();  
04.loaderB.load(new URLRequest("module1.swf"), contextB); 
var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain;
var contextB:LoaderContext = new LoaderContext(false, appDomainB);
var loaderB:Loader = new Loader();
loaderB.load(new URLRequest("module1.swf"), contextB);

子域,子域中的类引用父应用中的类定义

view plaincopy to clipboardprint?
01.var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);  
02.var contextC:LoaderContext = new LoaderContext(false, appDomainC);  
03.var loaderC:Loader = new Loader();  
04.loaderC.load(new URLRequest("module3.swf"), contextC); 
var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
var contextC:LoaderContext = new LoaderContext(false, appDomainC);
var loaderC:Loader = new Loader();
loaderC.load(new URLRequest("module3.swf"), contextC);

注意事项
加载图片或是用ActionScript 1.0/2.0 编写的SWF文件时,不可以使用应用程序域,因为应用程序域只能应用于ActionScript 3.0,我们可以通过函数“getDefinition”来获取已经加载的类定义

应用程序域之间形成的是一个树形结构,它们之间靠“parentDomain”来链接,而最顶层是系统域(system domain),它包括了Flash内置类型,如Sprite、Textfield等

当一个子应用中的类定义无论是以共享域还是子域的形式被加载,如过发现父应用中已经定义了的这个即将被加载的类,那么这个类定义的加载被忽略

应用程序域仅在一个安全域中有效,它不允许跨域使用

更多例子
共享域加载

- the HelloW class from MyApplication

- the SWFHelloW class from SWF1

子域加载

- the HelloW class from MyApplication

- the SWFHelloW class from SWF1 and SWF2

独立域加载

- the HelloW class from MyApplication

- the HelloW class from SWF1 and SWF2

- the SWFHelloW class from SWF1 and SWF2

TODO疑问
view plaincopy to clipboardprint?
01.function create(className:String):Object  
02.{  
03.  var clazz:Class   
04.   = Class(ApplicationDomain.currentDomain.getDefinition(className);  
05.  return new clazz();  
06.} 
function create(className:String):Object
{
  var clazz:Class
   = Class(ApplicationDomain.currentDomain.getDefinition(className);
  return new clazz();
}

当我们在子应用中定义了工具方法create,其中的ApplicationDomain.currentDomain是父应用的currentDomain,还是当前的currentDomain?

参考文档
http://blogs.adobe.com/rgonzalez/2006/06/applicationdomain.html

http://ghalex.com/blog/application-domains-in-flex

http://livedocs.adobe.com/flex/3/html/help.html?content=18_Client_System_Environment_5.html


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rcom10002/archive/2010/03/02/5340269.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值