コードを見て、メモリリークが発生するのではないかと懐疑的で興味をそそられたので、自分でコードをテストしました。
投稿したコードは実際には実行できません。app tagやimportステートメント(およびhttpサービスサイクルがいつ完了するかを確認するためのカウンターラベル)のように実行するための最低限の機能を追加しました。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="application1_creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import mx.rpc.http.HTTPService;
import mx.collections.XMLListCollection;
import mx.rpc.events.ResultEvent;
import mx.events.FlexEvent;
private var xmlC:XMLListCollection = new XMLListCollection();
private var httpS:HTTPService = new HTTPService();
private var timer:Timer = new Timer(1000);
private var xmlData:XML;
private var xmlDataList:XMLList;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
httpS.url = "data.xml";
httpS.addEventListener(ResultEvent.RESULT, resultHTTP);
httpS.resultFormat="e4x";
httpS.send();
timer.start();
timer.addEventListener(TimerEvent.TIMER, updateXMLC);
}
private function updateXMLC(event:TimerEvent):void
{
xmlC.source = xmlDataList;
httpS.send();
}
private function resultHTTP(event:ResultEvent):void
{
counter.text = Number(parseInt(counter.text,10)+1).toString();
xmlData = event.result as XML;
xmlDataList = xmlData.dg.rows.row;
}
]]>
</mx:Script>
<mx:Label id="counter" text="0" horizontalCenter="0" verticalCenter="0" fontSize="72"/>
</mx:Application>
良いニュースは、コードにメモリリークがないことです。また、プロファイラーには浮浪オブジェクトはありません。
悪いニュースは、アプリケーションで他に何をしているのか(ここに投稿されていないコード、何らかの理由で省略されているコード)です。これは、リーク/浮浪オブジェクトがある場所です。
添付されたコードのプロファイラーで、httpサービスの最初の数サイクル後にメモリが増加しないことがわかります。つまり、時間の経過とともにより多くのメモリを把握し続けることはありません。(ちなみに、私がプルしているXMLファイルは約8000行で、1MBを超えています)。
さらにコードを投稿したい場合は、さらに詳しく調べてください。ただし、これで今のところこの謎は解決すると思います。;)
これがあなたのしていることに対するいくつかの修正です:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="application1_creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import mx.rpc.http.HTTPService;
import mx.collections.XMLListCollection;
import mx.rpc.events.ResultEvent;
import mx.events.FlexEvent;
[Bindable] private var xmlC:XMLListCollection = new XMLListCollection();
private var httpS:HTTPService = new HTTPService();
private var timer:Timer = new Timer(1000);
private var xmlData:XML;
private var xmlDataList:XMLList;
private var serviceRunning : Boolean = false;
private var currentData : String = '';
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
httpS.url = "data.xml";
httpS.addEventListener(ResultEvent.RESULT, resultHTTP);
httpS.resultFormat="e4x";
httpS.send();
timer.start();
timer.addEventListener(TimerEvent.TIMER, updateXMLC);
}
private function updateXMLC(event:TimerEvent):void
{
xmlC.source = xmlDataList;
if( !serviceRunning ){ // don't call for more data until
httpS.send(); // you've gotten back last call
}
}
private function resultHTTP(event:ResultEvent):void
{
// make sure we have differences before rebinding
var newData : String = event.result as String;
serviceRunning = false;
counter.text = Number(parseInt(counter.text,10)+1).toString();
if( newData != currentData ){
xmlData = event.result as XML;
currentData = newData;
xmlDataList = xmlData.dg.rows.row;
}
}
]]>
</mx:Script>
<mx:Label id="counter" text="0" horizontalCenter="0" verticalCenter="0" fontSize="72"/>
</mx:Application>