`
bnmcvzx
  • 浏览: 10098 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

flash开发环境中用Loader 去load 资源库并用getDefinition取资源库中的类之怪异结果

阅读更多

flash开发的时候模拟加载不同域的swf文件并取得资源库中定义的类。Security.sandboxType为localTrusted。

资源文件lib.swf 中有3个元件(3个影片剪辑)。分别为Lib1,Lib2,Lib3 并分别导出为Class Lib1,Lib2,Lib3。

元件Lib3 中 有Lib1 跟Lib2个一个实例。

资源文件lib2.swf为空的flash文件。为配合测试使用。

lib.swf 跟lib2.swf位于网络上。http://127.0.0.1/lib.swfhttp://127.0.0.1/lib2.swf

类ApplicationDomainExample 继承自Sprite,在flex builder 中将以debug方式运行。类ApplicationDomainExample 中有两个Loader,loader和 loader2。loader去load资源文件lib.swf,loader2去load资源文件 lib2.swf。并在loader2结束之后用loader.contentLoaderInfo.applicationDomain.getDefinition得到Class  Lib3并实例化。

分三种load方式。LoaderContext都为new LoaderContext(false,ApplicationDomain.currentDomain)

方式一: 得到想要的结果

当loader 跟loader2在同一个方法中分别去load位于网络中的lib.swf 跟lib2.swf时此时用getDefinition("Lib3") 取得的类 完全可以new新的实例。

方式二: 失败

当loader完成之后 在去执行loader2的load在loader2 load完成时getDefinition("Lib3")  可以得到Class Lib3 。但报Type error。不能将MovieClip@xxx 转化为类  Lib1

方式三:

跟方式二步骤一样只是loader2  load的是本地文件路径(lib2.swf)。此时得到想要的结果。

代码:

package {
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	/**
	 *flash 加载问题 
	 * @author limingzhou
	 * 
	 */	
	public class ApplicationDomainExample extends Sprite
	{
		private var loader:Loader;
		private var loader2:Loader;
		private var defaultContext:LoaderContext;
        public function ApplicationDomainExample() {
        	defaultContext=new LoaderContext(false,ApplicationDomain.currentDomain);
        	
        	loader=new Loader();
        	loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete);
        	loader.load(getDefaultRequest("http://127.0.0.1/lib.swf"),defaultContext);
        	
        	loader2=new Loader();
        	loader2.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete2);
            
            /* 情况一  正常 */
            //loader2.load(getDefaultRequest("http://127.0.0.1/lib2.swf"),defaultContext);
        }
        private function loadComplete(e:Event):void{
        	loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loadComplete);
        	getUI(loader);
        	
        	/* 情况二  报错 */
        	//loader2.load(getDefaultRequest("http://127.0.0.1/lib2.swf"),defaultContext);  //load任何swf文件 包括它自己出错
        	
        	/* 情况三  正常  */
        	loader2.load(getDefaultRequest("lib2.swf"),defaultContext);
        }
        private function loadComplete2(e:Event):void {
        	loader2.contentLoaderInfo.removeEventListener(Event.COMPLETE,loadComplete2);
        	/*要取得的lib库中的导出类  */
        	getUI(loader);
        }
        private function getDefaultRequest(url:String):URLRequest{
        	return new URLRequest(url);
        }
        private function getUI(l:Loader):void{
        	var ui:Class=l.contentLoaderInfo.applicationDomain.getDefinition("Lib3") as Class;
        	trace(ui);
           	trace(new ui); 
        }
    }
}

 

方式一跟方式二得到两种不同的结果很怪异,疑似flash 的一个问题。资源文件及完整代码见附件。(说明如果在lib.swf中 Lib1,Lib2,Lib3分别是自己定义的时候也正确这个属于解决办法的一种)

  • 大小: 11.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics