使用 ApplicationDomain 类

ApplicationDomain 类的用途是存储 ActionScript 3.0 定义表。SWF 文件中的所有代码被定义为存在于应用程序域中。可以使用应用程序域划分位于同一个安全域中的类。这允许同一个类存在多个定义,并且还允许子级重用父级定义。

在使用 Loader 类 API 加载用 ActionScript 3.0 编写的外部 SWF 文件时,可以使用应用程序域。(请注意,在加载图像或用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件时不能使用应用程序域。)包含在已加载类中的所有 ActionScript 3.0 定义都存储在应用程序域中。加载 SWF 文件时,通过将 LoaderContext 对象的 applicationDomain 参数设置为 ApplicationDomain.currentDomain, 可以指定文件包含在 Loader 对象所在的相同应用程序域中。通过将加载的 SWF 文件放在同一个应用程序域中,可以直接访问它的类。如果加载的 SWF 文件包含嵌入的媒体(可通过其关联的类名称访问),或者您要访问加载的 SWF 文件的方法,则这种方式会很有用,如下面的示例所示:

ActionScript代码
  1. package   
  2. {   
  3.     import flash.display.Loader;   
  4.     import flash.display.Sprite;   
  5.     import flash.events.*;   
  6.     import flash.net.URLRequest;   
  7.     import flash.system.ApplicationDomain;   
  8.     import flash.system.LoaderContext;   
  9.    
  10.     public class ApplicationDomainExample extends Sprite   
  11.     {   
  12.         private var ldr:Loader;   
  13.         public function ApplicationDomainExample()   
  14.         {   
  15.             ldr = new Loader();   
  16.             var req:URLRequest = new URLRequest("Greeter.swf");   
  17.             var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);   
  18.             ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);   
  19.             ldr.load(req, ldrContext);       
  20.         }   
  21.         private function completeHandler(event:Event):void   
  22.         {   
  23.             ApplicationDomain.currentDomain.getDefinition("Greeter");   
  24.             var myGreeter:Greeter = Greeter(event.target.content);   
  25.             var message:String = myGreeter.welcome("Tommy");   
  26.             trace(message); // Hello, Tommy   
  27.         }   
  28.     }   
  29. }  

使用应用程序域时,还要记住以下几点:

  • SWF 文件中的所有代码被定义为存在于应用程序域中。主应用程序在“当前域”中运行。“系统域”中包含所有应用程序域(包括当前域),也就是包含所有 Flash Player 类。

  • 所有应用程序域(除系统域外)都有关联的父域。主应用程序的应用程序域的父域是系统域。已加载的类仅在其父级中没有相关定义时才进行定义。不能用较新的定义覆盖已加载类的定义。

下图显示了某个应用程序在单个域 (domain1.com) 中加载多个 SWF 文件的内容。根据加载内容的不同,可以使用不同的应用程序域。紧跟的文本说明用于为应用程序中的每个 SWF 文件设置适当应用程序域的逻辑。

A.
用法 A
B.
用法 B
C.
用法 C

主应用程序文件为 application1.swf。它包含从其它 SWF 文件加载内容的 Loader 对象。在此方案下,当前域为 Application domain 1。用法 A、用法 B 和用法 C 说明了为应用程序中的每个 SWF 文件设置适当应用程序域的不同方法。

用法 A
通 过创建系统域的子级划分子级 SWF 文件。在示意图中,Application domain 2 创建为系统域的子级。application2.swf 文件在 Application domain 2 中加载,因此其类定义从 application1.swf 中定义的类中划分出来。

此方法的一个用处是使旧版应用程序能够动态加载相同应用程序的更新版本,而不会发生冲突。之所以不发生冲突,是因为尽管使用的是同样的类名称,但它们划分到不同的应用程序域中。

下面的代码创建作为系统域子级的一个应用程序域,并使用该应用程序域开始加载一个 SWF:

ActionScript代码
  1. var appDomainA:ApplicationDomain = new ApplicationDomain();   
  2.    
  3. var contextA:LoaderContext = new LoaderContext(false, appDomainA);   
  4. var loaderA:Loader = new Loader();   
  5. loaderA.load(new URLRequest("application2.swf"), contextA);  
用法 B:
在 当前类定义中添加新的类定义。module1.swf 的应用程序域设置为当前域 (Application domain 1)。这可让您将新的类定义添加到应用程序当前的一组类定义中。这可用于主应用程序的运行时共享库。加载的 SWF 被视为远程共享库 (RSL)。使用此方法可以在应用程序启动之前使用预加载器加载 RSL。

下面的代码加载一个 SWF,同时将其应用程序域设置为当前域:

ActionScript代码
  1. var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain;   
  2.    
  3. var contextB:LoaderContext = new LoaderContext(false, appDomainB);   
  4. var loaderB:Loader = new Loader();   
  5. loaderB.load(new URLRequest("module1.swf"), contextB);  
用法 C:
通 过创建当前域的新子域,使用父级的类定义。module3.swf 的应用程序域是当前域的子级,并且子级使用所有类的父级的版本。此方法的一个用处可能是作为一个使用主应用程序的类型的多屏幕丰富 Internet 应用程序 (RIA) 模块,该模块作为主应用程序的子级加载。如果能够确保所有类始终更新为向后兼容,并且正在加载的应用程序始终比其加载的软件的版本新,则子级将使用父级版 本。如果可以确保不继续拥有对子级 SWF 的引用,则拥有了新的应用程序域还使您能够卸载所有的类定义以便于垃圾回收。

此方法使加载的模块可以共享加载者的 singleton 对象和静态类成员。

下面的代码创建当前域的一个新子域,并使用该应用程序域开始加载一个 SWF:

ActionScript代码
  1. var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);   
  2.    
  3. var contextC:LoaderContext = new LoaderContext(false, appDomainC);   
  4. var loaderC:Loader = new Loader();   
  5. loaderC.load(new URLRequest("module3.swf"), contextC);  

收藏自adobehelp.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e07.html

下面文章或许你还感兴趣

  • AS3应用程序模块化开发与ApplicationDomain
  • PureMVC for ActionScript框架的理解
  • Spring ActionScript简介
  • Preloaders in AS3
  • Reflection in Actionscript 3.0/Flex 2
  • 买了本<<flash actionscript 3.0殿堂之路>>
  • Flex-如何在一个as文件中写多个public 类
  • Flex 全局函数定义
  • FWD: Creating an Executable Apache Pivot App using Maven
  • 如何获取Flex对象实例的Class

Today on history:

  1. 2011:  TRIBON线形光顺时遇到的问题及解决办法(0)
  2. 2009:  用Python调用中控SDK存取考勤机数据库(0)

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>