2013-09-23 17 views
0

我一直在为此奋斗一段时间。 我有一个加载器每十秒加载一个外部图像。我的问题是,虽然我已经尝试过所有类型的东西来清理它,但每次加载图像时都会消耗更多的内存。加载程序不会从内存中清除

正如你所看到的,在代码的最后,我尝试了一切,我可以找到没有任何结果。每发生一次myLoader.load(fileRequest),内存使用量就会越来越大。

有什么想法?

:-(

var tenSec:Timer = new Timer(1000,10); 
var image:DisplayObject; 
var myLoader:Loader; 

tenSec.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 
tenSec.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 
tenSec.start(); 

function onTimerComplete(event:TimerEvent):void 
{ 
    myLoader= new Loader(); 
    myLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoaderReady); 
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderReady, false, 0, true); 

    var fileRequest:URLRequest = new URLRequest("http://"+ip+"/radiosite/image.jpg?nocache=" + new Date().getTime()); 
    myLoader.load(fileRequest); 
    function onLoaderReady(e:Event) 
    { 
    image = myLoader.content; 
    addChild(image); 
    image = null; 
    myLoader.unload(); 
    myLoader = null; 
    System.gc(); 
    fileRequest = null; 
    } 
    tenSec.reset(); 
    tenSec.start(); 

} 

回答

1

乍一看:你在呼唤每次addChild(image);加载一个新的形象,但从来没有从stage删除image孩子打电话addChild一次外onTimerComplete,只是更换。内容。

没有必要废除装载机myLoaderfileRequest尤其是image。你过于卖力。

另外,不要强制垃圾收集。当需要完成时,Flash运行时会为你做这件事。使用System.gc作为解决方法不会使内存树中的其余链接无效。

最后,使用定时器(每1秒)重新加载图像可能不是一个好主意。在某些情况下,加载图像需要超过1秒的时间。而是使用异步函数递归来获取新图像:只有当图像完成加载时,您应该等待1秒(此时使用间隔)来获取新图像。

+0

我认为你是完全正确的,由于某种原因,我不认为注释掉addChild,看看是否会导致问题! 还有一个问题是: 如何添加**图像**,因为它在** onTimerComplete **之前为null,我无法实例化DisplayObject(var image:DisplayObject = new DisplayObject();)? –

+0

AWWGG..Ignore我,我累了....我只是添加了相同的代码来加载一次以外的onTimerComplete图像。 非常感谢您的帮助 –

+0

@StratosIon如果有帮助请投票,如果是解决方案,请接受答案。 ty,很高兴我能帮上忙! – zamnuts