Apache flex 导致内存泄漏的Flex ModuleLoader组件。如何正确卸载模块?

Apache flex 导致内存泄漏的Flex ModuleLoader组件。如何正确卸载模块?,apache-flex,memory-leaks,flex3,flex4,Apache Flex,Memory Leaks,Flex3,Flex4,应用程序太大,无法在这里描述,但我可以告诉您,我有多达20个或更多的模块,客户端可以随时使用。如果我继续加载一个又一个屏幕,我的应用程序可以支持500MB甚至更多 我用来加载和卸载模块的脚本是: public function createModule(modulo:String):void { if(moduleLoader != null){ moduleLoader.unloadModule();

应用程序太大,无法在这里描述,但我可以告诉您,我有多达20个或更多的模块,客户端可以随时使用。如果我继续加载一个又一个屏幕,我的应用程序可以支持500MB甚至更多

我用来加载和卸载模块的脚本是:

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.");
            }
装载模块的容器:

<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>

如果您使用的是Flex 4.5,请尝试改用
。 更多详细信息:

来自:

HierachicalData
AdvancedDataGrid
一起使用时,控件通过使用
iHierachicalCollectionView
界面跟踪分层和分组数据。接口具有一个
openNodes
属性,该属性包含一个对象数组,表示当前在AdvancedDataGrid中打开的数据提供程序的节点

如果用新的数据提供程序替换数据提供程序,则
AdvancedDataGrid
控件不会清除
openNodes
属性。由于
openNodes
属性包含对旧数据提供程序中对象的引用,因此无法通过垃圾收集从内存中删除这些对象。要确保旧的数据提供程序可以从内存中删除,请在替换数据提供程序时使用事件处理程序清除
openNodes
属性

将事件侦听器添加到数据提供程序的
CollectionEvent.COLLECTION\u CHANGE
事件以清除openNodes属性

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

确保每个模块的子组件也已删除其
eventListeners
。我不认为这些模块中有任何一个有
AdvancedDataGrids
HierarchycalData
吗?是的,它们都有高级数据网格。有些模块也有泄漏的弹出窗口,但我不需要打开它们,应用程序在导航不同的模块时就会泄漏数据。这些AdvancedDataGrids是否使用
HierarchicalData
?我遇到了一个类似的问题,我的
AdvancedDataGrids
导致内存泄漏。我不知道你说的HierarchicalData是什么意思,抱歉:S。数据网格在每个模块中都作为传统的mxml编写,并作为结果处理程序的ArrayCollection分配给数据提供程序。我正在使用Flex 4,现在切换已经太晚了,项目已经启动,已经有客户在使用它。我目前正在使用Ok,这听起来很尴尬,但我不知道在CollectionEvent类中的何处添加该事件侦听器。还是我完全迷路了?@overmann别担心查看一个快速示例。等等。这里有一个问题,我的dg.dataProvider对象未被识别为IHierarchicalCollectionView。@overmann是否使用可折叠组或树状格式显示数据?如果您只是以传统的单行格式显示数据,它可能不会使用
IHierachicalCollectionView
,因为没有要跟踪的节点。@overmann然后我会尝试确保您模块的所有子组件的EventListener都已删除。如果仍然存在任何eventListeners,它将在内存中保留该组件。
// Handle the colectionChange event.
private function removeOpenNodes(event:CollectionEvent):void 
{
  if(event.kind == CollectionEventKind.RESET)
    IHierarchicalCollectionView(adg.dataProvider).openNodes = {};
}