·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]ApplicationDomain类之外部swf应用(2)

时间:2014-01-23 21:56cnblogs.com
ApplicationDomain 是存放AS3定义(包括类、方法、接口等)的容器。使用Loader类加载swf时可以通过指定 ApplicationDomain 参数将swf加载到不同的域(Domain): varloader: Loader = new Loader(); varcontext: Loader

        ApplicationDomain 是存放AS3定义(包括类、方法、接口等)的容器。使用Loader类加载swf时可以通过指定 ApplicationDomain 参数将swf加载到不同的域(Domain):

  1. var loader : Loader = new Loader(); 
  2. var context : LoaderContext = new LoaderContext(); 
  3. /* CuPlayer.com提示:加载到子域(模块) */ 
  4. context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 
  5. /* CuPlayer.com提示:加载到同域(共享库) */ 
  6. context.applicationDomain = ApplicationDomain.currentDomain; 
  7. /* CuPlayer.com提示:加载到新域(独立运行的程序或模块) */ 
  8. context.applicationDomain = new ApplicationDomain(); 
  9. 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里边仅仅就放了一个元件链接)

  1. package  
  2.     import flash.display.Sprite; 
  3.     import flash.display.Loader; 
  4.     import flash.net.URLRequest; 
  5.     import flash.events.Event; 
  6.     import flash.events.MouseEvent; 
  7.     import flash.system.LoaderContext; 
  8.     import flash.system.ApplicationDomain; 
  9.     import flash.text.TextField; 
  10.     import flash.text.TextFormat; 
  11.     import UiDomain; 
  12.  
  13.     [SWF(width = "720",height = "450",backgroundColor = "#0000ff")] 
  14.     public class Main extends Sprite 
  15.     { 
  16.         private var flower; 
  17.         private var way:String; 
  18.         private var loadContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain); 
  19.         public function Main():void 
  20.         { 
  21.             var num=int(100*Math.random()); 
  22.             if (num%3==0) 
  23.             { 
  24.                 way = "1"
  25.             } 
  26.             else if (num%3==1) 
  27.             { 
  28.                 way = "2"
  29.             } 
  30.             else if (num%3==2) 
  31.             { 
  32.                 way = "3"
  33.             } 
  34.             loadUi(); 
  35.             showWay("CuPlayer.com提示:以第"+way+"种方式"); 
  36.         } 
  37.  
  38.         private function loadUi() 
  39.         { 
  40.             var myLoader:Loader=new Loader(); 
  41.             var myRequest:URLRequest=new URLRequest(); 
  42.             myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); 
  43.             myRequest.url = "UI.swf"
  44.             if (way=="1") 
  45.             { 
  46.                 myLoader.load(myRequest,UiDomain.context); 
  47.             } 
  48.             else if(way=="2") 
  49.             { 
  50.                 myLoader.load(myRequest,loadContext); 
  51.             } 
  52.             else if(way=="3") 
  53.             { 
  54.                 myLoader.load(myRequest); 
  55.             } 
  56.              
  57.         } 
  58.         private function completeHandler(e:Event) 
  59.         { 
  60.             showUI(e.currentTarget); 
  61.         } 
  62.         private function showUI(mc) 
  63.         { 
  64.             trace(mc); 
  65.             if (way=="1") 
  66.             { 
  67.                 flower =new (UiDomain.getDefinition('Flower') as Class); 
  68.             } 
  69.             else if(way=="2") 
  70.             { 
  71.                 //var mini:Class = getDefinition('Flower'); 
  72.                 var mini:Class=ApplicationDomain.currentDomain.getDefinition('Flower') as Class; 
  73.                 flower = new mini(); 
  74.             } 
  75.             else 
  76.             { 
  77.                 //CuPlayer.com提示:创建一个程序应用域 
  78.                 var app:ApplicationDomain=mc.applicationDomain; 
  79.                 //CuPlayer.com提示:使用 getDefinition 获取UI中的链接名为Flower的类 
  80.                 var mita:Class=app.getDefinition('Flower') as Class; 
  81.                 flower=new mita(); 
  82.             } 
  83.             flower.x = stage.stageWidth / 2  ;;//- flower.width / 2; 
  84.             flower.y = stage.stageHeight / 2  ;;//- flower.height / 2; 
  85.             addChild(flower); 
  86.             flower.buttonMode = true
  87.            flower.addEventListener(MouseEvent.CLICK,clickHandler); 
  88.         } 
  89.         private function clickHandler(e:MouseEvent) 
  90.         { 
  91.             e.target.rotation +=  15; 
  92.         } 
  93.         private function getDefinition(name:String) 
  94.         { 
  95.             if (name!=''||name!=null) 
  96.             { 
  97.                 return ApplicationDomain.currentDomain.getDefinition(name) as Class; 
  98.             } 
  99.             return null; 
  100.         } 
  101.         private function showWay(str:String) 
  102.         { 
  103.             var txt:TextField=new TextField(); 
  104.             var txtFormat:TextFormat=new TextFormat(); 
  105.             txtFormat.size = 13
  106.             txtFormat.bold = true
  107.             txt.setTextFormat(txtFormat); 
  108.             txt.text = str
  109.             txt.x = 10
  110.             txt.y = 5
  111.             addChild(txt); 
  112.         } 
  113.     } 
  114.  

 

  1. /* 
  2. *author: vini 
  3. *web: http://www.vini123.com; 
  4. *多处地方加载UI的话,可以利用这个封装类。 
  5. */ 
  6. package  
  7.     import flash.system.ApplicationDomain; 
  8.     import flash.system.LoaderContext; 
  9.     public class UiDomain 
  10.     { 
  11.         //没写构造函数了。 
  12.         public static const loaderContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain); 
  13.  
  14.         public static function get context() 
  15.         { 
  16.             return loaderContext; 
  17.         } 
  18.         //根据元件链接名获取加载进来的元件 
  19.         public static function getDefinition(name:String) 
  20.         { 
  21.             if (((name != '') || name != null)) 
  22.             { 
  23.                 return ApplicationDomain.currentDomain.getDefinition(name) as Class; 
  24.             } 
  25.             return null; 
  26.         } 
  27.         //判断是否存在该链接名的元件 
  28.         public static function hasDefinition(name:String) 
  29.         { 
  30.             if (((name != '') || name != null)) 
  31.             { 
  32.                 return ApplicationDomain.currentDomain.hasDefinition(name); 
  33.             } 
  34.             return false; 
  35.         } 
  36.  
  37.     } 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器