Posts Tagged ‘applicationDomain’

  • ApplicationDomain应该怎么用,文档都看了800多次了,就是记不住,没办法,天生的记忆力弱,这东西又不经常用。

    干脆总结一下写出来,以后如果再忘记,也不用去查文档了。

    new ApplicationDomain(ApplicationDomain.currentDomain) = Child可以直接使用Parent的Class,Parent则不可直接调用,必须是私用ApplicationDomain.getDefinition()来调用。

    ApplicationDomain.currentDomain  = Child和Parent可以任意使用对方的Class(Class重名会冲突)。

    new ApplicationDomain(null) = Child和Parent将使用自己的Class(Class重名不会冲突),如果一方要调用另一方的Class,要使用ApplicationDomain.getDefinition()。推荐用这种,麻烦就麻烦吧,起码可控性高。

     

  • 有需要的可以去跑一下。

    如何使用这个例子

    1.把AsChild.as中str赋值的部分编译两次,得到2个SWF文件,分别命名为AsChild.swf和AsChilden.swf。

    2.把上面两个SWF文件拷贝到Parent.mxml所在工程的bin目录下。

    3.通过更改Parent.mxml中注释(同时修改domain的赋值),来查看变化

    AsChild.as

    package {
    import flash.display.Sprite;
    
    public class AsChild extends Sprite
    {
    public function AsChild()
    {
    }
    
    public function show():String{
    return str;
    }
    
    private var str:String = '您好';
    //private var str:String = 'Hello';
    }
    }
    

    Parent.mxml

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    import mx.controls.Alert;
    
    private var loaderZH:Loader;
    private var loaderEN:Loader;
    private var swfLoaded:int;
    
    public function init():void{
    var url:String = 'AsChild.swf';
    var request:URLRequest = new URLRequest(url);
    var domain:ApplicationDomain = ApplicationDomain.currentDomain;
    //var domain:ApplicationDomain = new ApplicationDomain();
    //var domain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
    var policyFile:Boolean = false;
    var context:LoaderContext = new LoaderContext(policyFile,domain);
    loaderZH = new Loader();
    loaderZH.contentLoaderInfo.addEventListener(Event.COMPLETE,AsCompleteHandle);
    loaderZH.load(request,context);
    
    url = 'AsChilden.swf';
    request = new URLRequest(url);
    domain = ApplicationDomain.currentDomain;
    //domain = new ApplicationDomain();
    //domain = new ApplicationDomain(ApplicationDomain.currentDomain);
    context = new LoaderContext(policyFile,domain);
    loaderEN = new Loader();
    loaderEN.contentLoaderInfo.addEventListener(Event.COMPLETE,AsCompleteHandle);
    loaderEN.load(request,context);
    }
    
    private function AsCompleteHandle(e:Event):void{
    swfLoaded++;
    if(swfLoaded == 2) {
    AsCompleteHandleTwo();
    }
    
    }
    
    private function AsCompleteHandleTwo():void{
    var zhNewClass:Class = loaderZH.contentLoaderInfo.applicationDomain.getDefinition("AsChild") as Class;
    var zhClass:Object = new zhNewClass();
    Alert.show(zhClass.show());
    
    var enNewClass:Class = loaderEN.contentLoaderInfo.applicationDomain.getDefinition("AsChild") as Class;
    var enClass:Object = new enNewClass();
    Alert.show(enClass.show());
    }
    
    ]]>
    </mx:Script>
    </mx:Application>