[AS3]ApplicationDomain类之外部swf应用(2)
ApplicationDomain 是存放AS3定义(包括类、方法、接口等)的容器。使用Loader类加载swf时可以通过指定 ApplicationDomain 参数将swf加载到不同的域(Domain):
- var loader : Loader = new Loader();
- var context : LoaderContext = new LoaderContext();
- /* CuPlayer.com提示:加载到子域(模块) */
- context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
- /* CuPlayer.com提示:加载到同域(共享库) */
- context.applicationDomain = ApplicationDomain.currentDomain;
- /* CuPlayer.com提示:加载到新域(独立运行的程序或模块) */
- context.applicationDomain = new ApplicationDomain();
- loader.load(new URLRequest("loaded.swf"), context);
加载到子域(模块)
类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。
加载到同域(运行时共享库)
类似集合里的合并关系。被加载swf里的所有类定义被合并到当前域中可以直接使用。和加载到子域相同,和当前域同名的定义也会被忽略。
加载到新域(独立运行的程序或模块)
swf载入指定域之前,先要检查该域及其父域中是否存在同名类,重复定义一概忽略。如果加载别人写的程序,或者使用旧版本的主程序加载新版本的模块,为避免类名冲突就要加载到新域独立运行以使用自己的类。
模块加载到同域不是一样可以吗?为何要加载到子域呢?好处就在于,卸载一个加载到子域的模块时,只要确保清除所有到该模块的引用,模块的所有类定义将被垃圾回收(Garbage Collection)。
有两种方式可以访问 ApplicationDomain :
ApplicationDomain.currentDomain
currentDomain是ApplicationDomain的静态变量,表示当前代码所在的域。该变量很奇特,在主程序里指向主域,在加载到子域的模块里则指向该模块所在的子域。虽然 ApplicationDomain 有个 parentDomain 属性,但子域已经自动获得了父域的类定义,所以通过 ApplicationDomain.currentDomain 就可以获取父域定义了——包括主程序和加载到主域的共享库。(注:系统域不可直接访问,主域和所有新域即系统域子域的parentDomain属性为null)
LoaderInfo类的applicationDomain属性
此方式可以访问任何方式加载的swf的 ApplicationDomain。对于主程序来说,加载到同域的库定义已经存在于 ApplicationDomain.currentDomain ,而模块的类主程序一般用不到。所以这种方式个人不推荐使用。
ApplicationDomain 的 hasDefinition() 方法判断某定义是否存在,getDefinition() 方法获取指定的定义。
看上边的东东,是我在网上冬枣洗澡找出来的。能看多少就多少。感觉那种方式用的习惯好就用那个。下边,我贴一个自己写的代码。这个很简单,很明了,不拐弯抹角的。(只有两个flash,demo.swf,以及UI.swf,UI.swf里边仅仅就放了一个元件链接)
- package
- {
- import flash.display.Sprite;
- import flash.display.Loader;
- import flash.net.URLRequest;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.system.LoaderContext;
- import flash.system.ApplicationDomain;
- import flash.text.TextField;
- import flash.text.TextFormat;
- import UiDomain;
- [SWF(width = "720",height = "450",backgroundColor = "#0000ff")]
- public class Main extends Sprite
- {
- private var flower;
- private var way:String;
- private var loadContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);
- public function Main():void
- {
- var num=int(100*Math.random());
- if (num%3==0)
- {
- way = "1";
- }
- else if (num%3==1)
- {
- way = "2";
- }
- else if (num%3==2)
- {
- way = "3";
- }
- loadUi();
- showWay("CuPlayer.com提示:以第"+way+"种方式");
- }
- private function loadUi()
- {
- var myLoader:Loader=new Loader();
- var myRequest:URLRequest=new URLRequest();
- myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
- myRequest.url = "UI.swf";
- if (way=="1")
- {
- myLoader.load(myRequest,UiDomain.context);
- }
- else if(way=="2")
- {
- myLoader.load(myRequest,loadContext);
- }
- else if(way=="3")
- {
- myLoader.load(myRequest);
- }
- }
- private function completeHandler(e:Event)
- {
- showUI(e.currentTarget);
- }
- private function showUI(mc)
- {
- trace(mc);
- if (way=="1")
- {
- flower =new (UiDomain.getDefinition('Flower') as Class);
- }
- else if(way=="2")
- {
- //var mini:Class = getDefinition('Flower');
- var mini:Class=ApplicationDomain.currentDomain.getDefinition('Flower') as Class;
- flower = new mini();
- }
- else
- {
- //CuPlayer.com提示:创建一个程序应用域
- var app:ApplicationDomain=mc.applicationDomain;
- //CuPlayer.com提示:使用 getDefinition 获取UI中的链接名为Flower的类
- var mita:Class=app.getDefinition('Flower') as Class;
- flower=new mita();
- }
- flower.x = stage.stageWidth / 2 ;;//- flower.width / 2;
- flower.y = stage.stageHeight / 2 ;;//- flower.height / 2;
- addChild(flower);
- flower.buttonMode = true;
- flower.addEventListener(MouseEvent.CLICK,clickHandler);
- }
- private function clickHandler(e:MouseEvent)
- {
- e.target.rotation += 15;
- }
- private function getDefinition(name:String)
- {
- if (name!=''||name!=null)
- {
- return ApplicationDomain.currentDomain.getDefinition(name) as Class;
- }
- return null;
- }
- private function showWay(str:String)
- {
- var txt:TextField=new TextField();
- var txtFormat:TextFormat=new TextFormat();
- txtFormat.size = 13;
- txtFormat.bold = true;
- txt.setTextFormat(txtFormat);
- txt.text = str;
- txt.x = 10;
- txt.y = 5;
- addChild(txt);
- }
- }
- }
- /*
- *author: vini
- *web: http://www.vini123.com;
- *多处地方加载UI的话,可以利用这个封装类。
- */
- package
- {
- import flash.system.ApplicationDomain;
- import flash.system.LoaderContext;
- public class UiDomain
- {
- //没写构造函数了。
- public static const loaderContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);
- public static function get context()
- {
- return loaderContext;
- }
- //根据元件链接名获取加载进来的元件
- public static function getDefinition(name:String)
- {
- if (((name != '') || name != null))
- {
- return ApplicationDomain.currentDomain.getDefinition(name) as Class;
- }
- return null;
- }
- //判断是否存在该链接名的元件
- public static function hasDefinition(name:String)
- {
- if (((name != '') || name != null))
- {
- return ApplicationDomain.currentDomain.hasDefinition(name);
- }
- return false;
- }
- }
- }
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例