flex memory-leaks flex3 flex4

lg flex 2 review



El componente Flex ModuleLoader causa una pérdida de memoria. ¿Cómo puedo descargar los módulos correctamente? (2)

La aplicación es demasiado grande para describirla aquí, pero puedo decirle que tengo hasta 20 módulos o más que el cliente puede usar en cualquier momento. Y si continúo cargando pantalla tras pantalla, mi aplicación puede ocupar 500MB y más.

La secuencia de comandos que uso para cargar y descargar módulos es:

public function createModule(modulo:String):void { if(moduleLoader != null){ moduleLoader.unloadModule(); //moduleLoader.url = null; moduleLoader.url = "com/oss/facturable/components/" + modulo + "?version=" + model.configXML.versionApp; moduleLoader.loadModule(); } } private function errorHandler(e:ModuleEvent):void { Alert.show("No se ha podido cargar el modulo. Contacte al departamento técnico."); }

El contenedor en el que se carga el módulo:

<s:BorderContainer width="98%" height="98%" includeIn="mainState" styleName="bcModuleLoader" top="100"> <s:layout> <s:HorizontalLayout paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10"/> </s:layout> <s:Scroller width="100%" height="100%"> <s:Group> <mx:ModuleLoader id="moduleLoader" error="errorHandler(event)" width="100%" height="100%" horizontalAlign="center" verticalAlign="top" creationComplete="createModule(''bandejaEntrada.swf'')"/> </s:Group> </s:Scroller> </s:BorderContainer>

La función createModule se invoca siempre que hago clic en una opción de menú que considero irrelevante para publicar aquí. Con todo, esto es todo lo que tengo por ahora para que funcione y se escape: S

Esta es la función oficial de downloadModule, pensé, por lo que parece, que la memoria debería estar bien asignada con esto, quiero decir, ¡mira! Elimina todos los eventListeners y los objetos secundarios. ¿Cómo es que mi memoria permanece igual cuando descargo, y carga más memoria encima cuando abro un nuevo módulo? ¡Augh!

public function unloadModule():void { if (child) { removeChild(child); child = null; } if (module) { module.removeEventListener(ModuleEvent.PROGRESS, moduleProgressHandler); module.removeEventListener(ModuleEvent.SETUP, moduleSetupHandler); module.removeEventListener(ModuleEvent.READY, moduleReadyHandler); module.removeEventListener(ModuleEvent.ERROR, moduleErrorHandler); module.unload(); module.removeEventListener(ModuleEvent.UNLOAD, moduleUnloadHandler); module = null; } }


De este artículo :

Al usar HierachicalData con AdvancedDataGrid , el control realiza un seguimiento de los datos jerárquicos y agrupados mediante el uso de la interfaz IHierarchicalCollectionView . La interfaz tiene una propiedad openNodes contiene una matriz de objetos que representan los nodos del proveedor de datos que actualmente están abiertos en AdvancedDataGrid.

Si reemplaza el proveedor de datos con un nuevo proveedor de datos, el control AdvancedDataGrid no borra la propiedad openNodes . Como la propiedad openNodes contiene referencias a objetos en el proveedor de datos anterior, los objetos no se pueden eliminar de la memoria mediante la recolección de elementos no utilizados. Para asegurarse de que el proveedor de datos anterior se puede eliminar de la memoria, utilice un controlador de eventos para borrar la propiedad openNodes cuando reemplace el proveedor de datos.

Agregue un detector de eventos al evento CollectionEvent.COLLECTION_CHANGE del proveedor de datos para borrar la propiedad openNodes.

// Handle the colectionChange event. private function removeOpenNodes(event:CollectionEvent):void { if(event.kind == CollectionEventKind.RESET) IHierarchicalCollectionView(adg.dataProvider).openNodes = {}; }


Si está utilizando Flex 4.5, intente usar <s:ModuleLoader/> lugar. Más detalles: aquí