flex swfloader unload

 

这样的一种情况:

使用Loader去load一个swf:

var fileURL:String = “assets/test.swf”
var swfLoader:Loader = new Loader();
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded);
swfLoader.load(new URLRequest(fileURL));

function swfLoaded(evt:Event):void{
    addChild(swfLoader);
}

这些是加载外部swf在AS3.0中最基本的代码,如果你在舞台上有一个按钮,点击时去调用 swfLoader.unload(),按道理的话应该会把加载到swfLoader里面的test.swf给清除。

问题产生: 如果test.swf中包含声音,则会出现调用unload方法后声音还是存在。

通常情况下会怀疑自己的代码是不是有问题,或者还是别的什么。。。但是即使在最简情况下也出现这样的问题,那就要追寻缘由了。在网上找了很多相关的文章,大部分都给了这个链接: http://www.gskinner.com/blog/archives/2008/04/failure_to_unlo.html  gskinner,很强的团队,以后再介绍了。里面体介绍了问题出现的情况。

unload是flash player9的一个bug,出现的情况就是flash player无法回收loader中load的元件,unload做的工作只是将load的元件移除Loader的display list(显示列表)。而只要load的swf中包含复杂的代码,或者说有任何事件侦听代码就无法使将其回收,当然也就无法回收他占用的内存。如果有大量的加载的话很有可能让程序崩溃。然而如果swf中有声音更是直接影响。总不能停止所有声音吧。

解决方法:

读gskinner的那篇文章,你会发现他并没有直接给出解决方法,只有一些建议。读了评论你会发现更是有意思,开始大部分是夸奖,到了后来却很多是抱怨,说什么只是谈,没有解决方法阿什么的,而且会发现没人说自己顺利解决了问题。看样子真是一个很大的bug。从我个人来说我试了其中的一些方法,也没有成功。但是其中有一种方法值得我们研究,叫“GC“,垃圾回收机制强行执行,有两篇文章可以参考:http://bbs.actionscript3.cn/thread-234-1-1.html  还有就是:http://www.ultrashock.com/forums/random-chat/failure-to-unload-flash-player-9s-dirty-secret-99237.html

主要代码:

package ...
{   
    import flash.display.Loader;   
    import flash.net.LocalConnection;    
    public class CustomLoader extends Loader   
    {       
        override public function unload():void       
        {           
            super.unload();            
            try           
            {               
                new LocalConnection().connect( "FORCE_GC" );               
                new LocalConnection().connect( "FORCE_GC" );           
            }           
            catch( err:Error )           
            {}       
        }   
    }
}

我试了,虽然没有成功,但是很有启发,就是使得内部抱错,然后让flash的垃圾回收机制去回收,那样就达到了清除的目的。值得研究。

我个人的解决方法:

1、如果你愿意接受失去flash player 9.0用户的风险,你可以使用adboe在flash player 10中新发布的api,Loader.unloadAndStop,可以说是对于9.0这个bug的一个郑重的补救,详细使用可以参考:http://kb.adobe.com/selfservice/viewContent.do?externalId=kb403670&sliceId=2

2、如果你用过AS2.0你会发现2.0中也有一个类似的这样的方法,加载使用的是loadMovie, 移除用的方法叫做:unloadMovie, 而且没有像AS3.0这样的bug。由于我在给新浪做广告播放器,由于公司不可能冒险无法清除内容出错(如果用户没有flash palyer 10),所以可以接收的解决方法是有音频的广告swf使用2.0语言来发布。而我这边开发端的方法是这样:创建一个广告swf加载容器(AS2.0语言发布)专门用于加载带声音的swf,这样可以使用unloadMovie来实现无bug移除。而对于“swf加载容器”与主容器(AS3.0语言发布)的通信,则可以通过 LocalConnection 来实现两种不同虚拟机的flash版本文件之间通信,详细代码参考以下帮助文档吧(位置: Programming ActionScript 3.0    Networking and communication > Connecting to other Flash Player instance )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值