2013-09-23 48 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