Memory Leak in AdvancedDataGrid HeaderRenderer

 

There is huge memory leak  while Extending AdvancedDataGridHeaderRenderer to create custom headerRenderer  for AdvancedDataGrid

If  you Refresh your AdvancedDataGrid  by  reassign DataProvider then instance of   itemRenderer  become Double every time .

Here i am giving sample code .

Create new project and copy and past code . Run from flex 3 profile .

if you click on ResetDataProvider Button  and instance  of EXRDeviceListLabel from profile .

instance of ExrDeviceListLabel  increased  on every click of ResetDataProvider .

 

 

MemoryLeak.mxml

  1: <?xml version="1.0" encoding="utf-8"?>
  2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
  3: <mx:Script source="memoryLeak.as"/>
  4: <mx:VBox width="100%" height="100%">
  5: <mx:AdvancedDataGrid  id="deviceListDG" width="100%" height="50%"/>
  6: <mx:Button id="resetDataGrid" click="resetDataProvider();" label="ResetDataProvider"/>  
  7: </mx:VBox>
  8: </mx:Application>


memoryLeak.as



 



  1: // ActionScript file
  2: import mx.collections.ArrayCollection;
  3: import mx.controls.AdvancedDataGrid;
  4: import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
  5: import mx.core.ClassFactory;
  6: import mx.core.IFactory;
  7: import mx.core.mx_internal;
  8: import mx.utils.ObjectProxy;
  9: use namespace mx_internal;
 10: 
 11: private static var headerR:IFactory = new ClassFactory(ExrHeaderRenderer);
 12: 
 13: 
 14: private var _columnsCollection:ArrayCollection = new ArrayCollection([
 15:     {columnWidth :"40"  , dataField : "serialIndex"  , visible : "true", headerText:"SerialIndex"},
 16:     {columnWidth : "80"  , dataField : "deviceType", visible : "true", headerText:"DeviceType"},
 17:     {columnWidth : "100" ,dataField : "powerStatus", visible : "true", headerText :"PowerStatus"},
 18:     {columnWidth : "120" ,dataField : "networkStatus", visible : "true", headerText:"NetworkStatus"},
 19:     {columnWidth : "150" ,dataField : "oS", visible : "true", headerText:"OS"},
 20:     {columnWidth : "200" ,dataField : "department", visible : "true", headerText:"Department"}
 21:     ])
 22: 
 23: private var _dgDataProvider:ArrayCollection = new ArrayCollection();
 24: private function init():void{
 25:   createDataGridColumns();
 26:   deviceListDG.validateDisplayList();
 27:   deviceListDG.validateProperties();
 28:   createdataProvider();
 29:   deviceListDG.dataProvider = _dgDataProvider;
 30: }
 31: 
 32: private function createdataProvider():void{
 33:   _dgDataProvider.removeAll();
 34:   var obj:ObjectProxy;
 35:   for(var i:int; i<100 ;i++){
 36:     obj = new ObjectProxy();
 37:     obj.serialIndex = i;
 38:     obj.deviceType = "Computer"+i;
 39:     obj.powerStatus = "ON"+i;
 40:     obj.networkStatus = "OFF";
 41:     obj.oS ="Window";
 42:     obj.department = "Symphony";
 43:     _dgDataProvider.addItem(obj);
 44:   }
 45:   
 46:   
 47: }
 48: private function createDataGridColumns():void{
 49:   var adgColumns:Array = deviceListDG.columns;
 50:   var adgColumn:AdvancedDataGridColumn;
 51:   var dataFieldName:String;
 52:   
 53:   for(var j:int=0; j<_columnsCollection.length; j++){
 54:       adgColumn = new AdvancedDataGridColumn();
 55:     adgColumn = setColumnProperties(adgColumn, _columnsCollection[j]);
 56:       adgColumns.push(adgColumn); 
 57:   }        
 58:   deviceListDG.columns = adgColumns
 59: }
 60: 
 61: private function setColumnProperties(adgColumn:AdvancedDataGridColumn, values:Object):
 62:    AdvancedDataGridColumn{
 63:   var dataFieldName:String;
 64:   dataFieldName = values.dataField;
 65:   adgColumn.dataField = dataFieldName;  
 66:   adgColumn.headerText = values.headerText;  
 67:   adgColumn.visible = (values.visible=="true");  
 68:         adgColumn.headerRenderer = headerR;
 69:   adgColumn.itemRenderer = new ClassFactory(EXRDeviceListLabel);
 70:   return adgColumn;
 71: }
 72: 
 73: private function resetDataProvider():void{
 74:   deviceListDG.dataProvider = [];
 75:   createdataProvider();
 76:   deviceListDG.dataProvider = _dgDataProvider;
 77:   deviceListDG.headerItems = null;
 78:   deviceListDG.headerRenderer = headerR;
 79: }
 80: 


 



ExrHeaderRenderer.as



  1: package
  2: {
  3:   import mx.controls.Label;
  4:   public class EXRDeviceListLabel extends Label
  5:   {
  6:     public function EXRDeviceListLabel()
  7:             {
  8:                   super();
  9:                   this.truncateToFit=true;
 10:             }
 11:             public function set label(value:String):void {
 12:               if(value == "" || value == "undefined" || value == null){ 
 13:           this.text = "";
 14:         }else{
 15:           this.text = value;
 16:                     this.setStyle("paddingLeft",5);
 17:                     this.setStyle("paddingRight",5);
 18:         }                 
 19:             }
 20:   }
 21: }




EXRDeviceListLabel.as





  1: package
  2: {
  3:   import mx.controls.Label;
  4:   public class EXRDeviceListLabel extends Label
  5:   {
  6:     public function EXRDeviceListLabel()
  7:             {
  8:                   super();
  9:                   this.truncateToFit=true;
 10:             }
 11:             public function set label(value:String):void {
 12:               if(value == "" || value == "undefined" || value == null){ 
 13:           this.text = "";
 14:         }else{
 15:           this.text = value;
 16:                     this.setStyle("paddingLeft",5);
 17:                     this.setStyle("paddingRight",5);
 18:         }                 
 19:             }
 20:   }
 21: }




please let me know if I am unclear .



Neeraj



0 comments: