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

本文探讨了Flash在加载不同域的SWF文件时遇到的问题,并详细分析了三种不同的加载方式下,如何获取并实例化资源文件中的自定义类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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分别是自己定义的时候也正确这个属于解决办法的一种)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值