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 file2: 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 = adgColumns59: }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: package2: {3: import mx.controls.Label;4: public class EXRDeviceListLabel extends Label5: {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: package2: {3: import mx.controls.Label;4: public class EXRDeviceListLabel extends Label5: {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