代码改变世界

用debug模式发布的怪问题

2010-02-13 15:34  hbb  阅读(507)  评论(0)    收藏  举报

flex sdk发布分Release模式和Debug模式。没仔细研究过,只听说Debug下发布的文件会大一点而已。

 

今天碰到个怪问题,用的是FlashDeveloper 3.6RTM测试的。

首先建立一个空的test.swf,debug模式下发布。

然后再建立一个loader.swf,用最阳春的代码加载test.swf,但要用Application.currentDomain。放两个handler,一个open,一个complete。

complete以后,再加载一次test.swf,第二次的complete就不会执行了。

 

但同样把test.swf,用release发布,就正常。或者loader用release发布,也正常。

即使两个都用debug发布,但放到远程调用,比如localhost加载也正常。

再而且,loader和test都放localhost上,也正常。

当然用Flash IDE就更正常了。

 

所以,我能碰到这种超级罕见的情况,是不是很无语...

说实在的,我并没有去无聊的玩儿Application.currentDomain,实际情况是我的一个子swf,用到了和父swf里相同的类。而两个swf发布的版本都是debug。所以情况就和用了Application.currentDomain一致...

就以上分析来看,关于这个莫名其妙的问题,和debug、release模式有关,和本地、非本地有关,是不是还和FlashDeveloper有关,暂时不知道。

先记一笔,以上。

发现似乎就是FD的问题....因为直接在本地打开也是OK的-_-||||

而且在不同的机器上测试了一下,结果还都不太一样,但总是有问题。

总结,如果加载和被加载的swf都是用FD发布的debug版本,那么连续调用就会出现问题,目前的3.06RTM是这样(3.02也是)。

以上。

 

 

放一下测试代码:

 

package  
{
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	
	/**
	 * ...
	 * @author hbb
	 */
	public class Test extends Sprite
	{
		private var _ldr:Loader;
		
		public function Test() 
		{
			if (stage) init(null);
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			_ldr = new Loader();
			_ldr.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
			_ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
			_ldr.load(new URLRequest('test.swf'), new LoaderContext(false, ApplicationDomain.currentDomain));
			
			stage.addEventListener(MouseEvent.CLICK, onClick);

		}
		
		private function onClick(e:MouseEvent):void 
		{
			_ldr.load(new URLRequest('test.swf'), new LoaderContext(false, ApplicationDomain.currentDomain));
		}
		
		private function onComplete(e:Event):void 
		{
			trace(e);
		}
		
		private function onOpen(e:Event):void 
		{
			trace(e);
		}
		
	}

}