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






Enable Hindi keyboard in Vista

How to type Hindi in vista

Enable the Hindi keyboard

1) go to Start

2) go to Control panel

3) Open "Region and Language Settings"

4) Click the "Keyboards and Languages" tab

5) Click the "Change keyboards" button

6) in the "General" tab, click the "Add..." button

7) Go down to "Hindi"

8) Expand the "Hindi" node

9) check the "Devanagari - INSCRIPT" option

10) click "OK"

--- Now you have the Hindi keyboard setup --

now you should create a hot key to switch back and fourth from your regular keyboard to Hindi.

I will show you how to setup a hot key for the Hindi keyboard. Use the same method for you normal keyboard.

1) Click on the "Advanced Key settings" in the dialog box that should still be up after step 10 above.

2) Select "To Hindi (India) - Devanagari - Inscript

3) Click the button "Change Key Sequence"

4) Select the key sequence that you want. for me, I use CTRL+2 from Hindi and CTRL+1 to English.