-
Singleton 2d array and XML never gets cleared from memory
Hey all,
I have created a Network class singleton to represent our xml calls. The purpose of the class is to load in various xml calls and then load into a 2 dimensional array.The 2 main variables that I want to release are "mChannels" and "epgXML". When I call the function term(), the memory never gets released. I am initializing this Network class once (mNetwork = Network.init(), and then referencing the singleton through the getInstance function. I call the term() function but the memory never goes down. What am I doing wrong with garbage collection?
Actionscript Code:
import mx.utils.Delegate; import skitter.model.User; import skitter.model.Channel; import skitter.model.Host; import skitter.model.Program; import skitter.view.EpgGrid; import skitter.util.xmlLoader; import org.casalib.util.StringUtil;
/**************************************** * Network Object * * Singleton object that represents the live network * of channels and programs. * */ class skitter.model.Network { private static var mBaseUrl:String = null; private static var mNetwork:Network = null; // keep count of the number of Singleton objects referenced private static var refCount:Number = 0;
public static var isReady:Boolean = false; public static var isEpgReady:Boolean = false; public static var counter:Number = 0; private var epgXml:XML = null; private var epgExtraXML:XML = null; private var mChannels:Array = null; private var mCurrentChannelIndex:Number = 0; private var mUser:User = null; public var initialHourBlock:Number = 6; // initial hours to load into epg script public var extraHoursBlock:Number = 6; public var totalHoursLoaded:Number = 0; // counter for total number of hours loaded into mChannels array private var mEpgGrid:EpgGrid = null; private var mMessageInterval:Number = null; private var mStartupDelayInterval:Number = null; /** * Init the singletin Network class * */ public static function init( ) { trace( "Network.init(): mNetwork="+mNetwork ); if( !mNetwork ) { mNetwork = new Network( ); counter ++; } } public static function term() { if( mNetwork ) { trace( "terminating network" ); isReady = false; isReady = null; delete isReady; isEpgReady = null; delete isEpgReady; mBaseUrl = null; delete mBaseUrl; mNetwork.epgXml = null; delete mNetwork.epgXml; mNetwork.epgExtraXML = null; delete mNetwork.epgExtraXML; //mNetwork.mChannels.length = 0; var ii:Number = 0; var jj:Number = 0; var channel:Object; var prog:Program; trace("mNetwork.mChannels.length: " + mNetwork.mChannels.length); var mChannelsLength = mNetwork.mChannels.length; for (ii= mNetwork.mChannels.length-1; ii >= 0; ii -- ) { trace("channel: " + ii); for (jj = 0;jj < mNetwork.mChannels[ii].mPrograms.length; jj++ ) { trace("prog: " + jj); prog = mNetwork.mChannels[ii].mPrograms.pop(); prog = null; delete prog; } channel = mNetwork.mChannels.pop(); channel = null; delete channel; } mNetwork.mChannels.length = 0; mNetwork.mChannels = null; delete mNetwork.mChannels; mNetwork.mCurrentChannelIndex = 0; mNetwork.mCurrentChannelIndex = null; delete mNetwork.mCurrentChannelIndex; mNetwork.totalHoursLoaded = 0; mNetwork.totalHoursLoaded = null; delete mNetwork.totalHoursLoaded; mNetwork.initialHourBlock = null; delete mNetwork.initialHourBlock; mNetwork.extraHoursBlock = null; delete mNetwork.extraHoursBlock; EpgGrid.destroy(); mNetwork = null; delete mNetwork; } } /** * Get the network instance * */ public static function getInstance():Network { refCount ++;
return(mNetwork); } /** * Constructor * */ private function Network() { trace( "Creating new network instance" ); mUser = User.getInstance(); if( null == mUser.getSecondarySms() ) { isReady = true; return; } mBaseUrl = mUser.getSecondarySms() + "/";
clearInterval( mStartupDelayInterval ); mStartupDelayInterval = setInterval( this, "loadEpg", Math.random( 2000) ); } public function findChannelByNumber( chanNo:Number ):Channel { var ii:Number; var chan:Channel = undefined; var chanStr:String; var mChannelsStr:String; chanStr = StringUtil.trim( chanNo.toString() ); for( ii = 0; ii < mChannels.length; ++ii ) { mChannelsStr = StringUtil.trim( mChannels[ ii ].mNumber.toString() ); if( mChannelsStr == chanStr ) { chan = mChannels[ ii ]; break; } } return chan; } /** * Get the channel array * */ public function getChannelArray( ):Array { return(mChannels); } /** * Get the current channel * */ public function getCurrentChannel():Channel { return(mChannels[mCurrentChannelIndex]); }
/** * Set the current channel based on the channel id. */ public function setCurrentChannel( id:String ) { var ii; trace( "setCurrentChannel( "+id+" )" ); for( ii = 0; ii < mChannels.length; ++ii ) { //trace( "Comparing given id: "+id+" to ["+ii+"]="+mChannels[ii].mId ); if( mChannels[ ii ].mId.toString() == id.toString() ) { mCurrentChannelIndex = ii; trace( "Got a hit, mCurrentChannelIndex = "+ mCurrentChannelIndex ); break; } } } /** * Get the next channel * */ public function getNextChannel():Channel { if( mCurrentChannelIndex < mChannels.length-1) { mCurrentChannelIndex++; } else { mCurrentChannelIndex = 0; } return(mChannels[mCurrentChannelIndex]); } /** * Get the previous channel * */ public function getPrevChannel():Channel { if( mCurrentChannelIndex > 0) { mCurrentChannelIndex--; } else { mCurrentChannelIndex = mChannels.length -1 ; } return(mChannels[mCurrentChannelIndex]); } /** * Load EPG data and create network hierarchy * */ private function loadEpg( ) { clearInterval( mStartupDelayInterval ); var epgStr:String; var now:Date = new Date(); var offset:Number = -(now.getTimezoneOffset() / 60); epgXml = new XML(); mChannels = new Array();
epgXml.ignoreWhite = true; isEpgReady = true; epgXml.onLoad = Delegate.create(this, onLoadXml); totalHoursLoaded += initialHourBlock;
epgStr = new String( mBaseUrl + "/smsapi/getEpgData.php?sess="+User.getInstance().getSessionId()+"&hours="+initialHourBlock+"&tz=" + offset ); epgXml.load(epgStr); trace( "Loading EPG data from: "+epgStr); return; } /** * onLoad function used to process XML * */ private function onLoadXml(isLoaded:Boolean) { // Make sure we loaded if (!isLoaded) { trace("Failed to load EPG XML file"); return; }
if (epgXml.firstChild.nodeName == "channels") { for (var ii:Number = 0; ii < epgXml.firstChild.childNodes.length; ii++) { var chan:Channel = Channel.createFromXml( epgXml.firstChild.childNodes[ii] ); mChannels.push(chan); } } trace("EPG XML Loading complete...."); isReady = true; // gc epgXml = null; return; };
}
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|