之前没有注意,我们在Air项目(使用Player9编译)中使用了SWFLoader,但是发现了一个非常致命的问题,就是发现SWFLoader占用的资源无法释放,除此之外,每一次加载swf 内存都随之增加。这个问题相当的困扰。
1、最小化真的能释放内存?
网上查了查,发现Air最小化后,内存骤然下降,就寻思参考仿照 最小化源代码 来实现内存的释放,但是后来才发现最小化只是实现了程序在虚拟内存与内存间的一个切换,并没有释放资源,当你第二次加载swf你就发现这是air的一个美丽的谎言。
2、unload, remove , gc , 设为null 难道就没有一个办法可以解决吗?
网上也说了,使用unload之类的方法实现资源的卸载,System.gc()显示回收垃圾,把swfloader引用设置为null. 还有removeChild(), removeEventListener等等,无所不用其极,但是并不能产生作用,起码从根本上来说。
从某篇文章中看到【 unload是flash player9的一个bug,出现的情况就是flash player无法回收 loader中load的元件,unload做的工作只是将load的元件移除Loader的display list(显示列表)。而只要load的swf中包含复杂的代码,或者说有任何事件侦听代码就无法使将其回收,当然也就无法回收他占用的内存。如果有大量 的加载的话很有可能让程序崩溃。然而如果swf中有声音更是直接影响。总不能停止所有声音吧。】
所以答案也就很明了了。
这个Bug能存活到现在,而且广为人知,就说明这是一个令到很多人(包括开发adobe团队)头疼的问题,所以如果你找到了Fix这个Bug的方法,请转述给我们听,相信会是非常震撼。
虽然Bug无可避免,但是山人也只有妙计,大家都找到了尽量避免这个Bug的方法:
1、使用Player10编译。缺点,可能会流失使用Player9的客户群,但是应该比较少吧,我估计。这比较冒险。
2、加载了文件后就不unload了,直接放着,不用的时候隐藏,用的时候激活一下就行了。缺点:暂用一定内存,但起码不用一直增长。
3、抛出异常。抛出异常,促使Air回收内存。但是抛出异常,会让用户无所适从,他不认识这个异常,他只认程序出错了。
4、使用HTML来取代SWFLoader。实现类似浏览器的功能,但是载入的swf必须以http://xxx/aaa.swf 或者http://xxx/aaa.html(包含了swf)的形式,对于桌面应用程序,这也是一个问题,但起码使用了HTML能很好的释放掉内存。