DataGroup 的 Itemrender 不会释放内存 - flex(Adobe air)
Itemrender of DataGroup won't release memory - flex(Adobe air)
我在 Adobe Air 应用程序中有一个数据组组件,我在其中使用了自定义 itemrenderer,我附上了 itemRenderer 的源代码以及我附上了它的分析,
问题:
当我从其他模块回到那个时候有这个数据组的模块时,它再次为 itemrender 创建对象,并且 itemrender 的先前对象不会被释放。
如果你有想法,请建议我
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="false"
buttonMode="true"
click="clickHandler(event)"
mouseChildren="false"
rollOut="rollOutHandler(event)"
rollOver="rollOverHandler(event)"
removedFromStage="itemrenderer1_removedFromStageHandler(event)"
creationComplete="itemrenderer1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import coX.XXXXXXXXXXXXXXX.event.ThumbEvent;
import mx.events.FlexEvent;
protected function image_completeHandler(event:Event):void
{
ConsoleUtils.logIt(" ThumbImage.mxml :image_completeHandler - ");
image.removeEventListener(Event.COMPLETE, image_completeHandler);
fadeIn.target=image;
fadeIn.play();
}
protected function clickHandler(event:MouseEvent):void
{
owner.dispatchEvent(new ThumbEvent("itemclick", data, itemIndex));
}
protected function rollOverHandler(event:MouseEvent):void
{
owner.dispatchEvent(new ThumbEvent("itemrollover", data, itemIndex));
}
protected function rollOutHandler(event:MouseEvent):void
{
owner.dispatchEvent(new ThumbEvent("itemrollout", data, itemIndex));
}
protected function itemrenderer1_removedFromStageHandler(event:Event):void
{
this.removeEventListener(Event.REMOVED_FROM_STAGE, itemrenderer1_removedFromStageHandler);
this.removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
this.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
this.removeEventListener(MouseEvent.CLICK, clickHandler);
this.removeAllElements();
}
protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void
{
this.removeEventListener(FlexEvent.CREATION_COMPLETE, itemrenderer1_creationCompleteHandler);
image.source="test.png";
//image.addEventListener(Event.COMPLETE, image_completeHandler);
}
]]>
</fx:Script>
<fx:Declarations>
<s:Fade id="fadeIn"
alphaFrom="0"
alphaTo="1"/>
</fx:Declarations>
<s:BitmapImage id="image"
horizontalAlign="center"
smooth="true"
smoothingQuality="high"
verticalAlign="middle"/>
</s:ItemRenderer>
分析快照
如您所见,在概要文件中,我有 21 个不会回收的孤立对象,概要文件显示我保存在第 12 行,而第 12 行是 creation_complete 事件,我已将其删除.
提前致谢
我已经使用 DataGroup
作为父组件并且我已经在 DataGroup
的 itemRenderer
属性 上面定义了 itemRenderer,并且在 dispose 函数中我已经定义了 DataGroup.itemRenderer
在 DataGroup
中为空。所以它将有资格获得GC。我看到现在内存中没有 itemRenderer 的实例。
我在 Adobe Air 应用程序中有一个数据组组件,我在其中使用了自定义 itemrenderer,我附上了 itemRenderer 的源代码以及我附上了它的分析,
问题: 当我从其他模块回到那个时候有这个数据组的模块时,它再次为 itemrender 创建对象,并且 itemrender 的先前对象不会被释放。
如果你有想法,请建议我
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="false"
buttonMode="true"
click="clickHandler(event)"
mouseChildren="false"
rollOut="rollOutHandler(event)"
rollOver="rollOverHandler(event)"
removedFromStage="itemrenderer1_removedFromStageHandler(event)"
creationComplete="itemrenderer1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import coX.XXXXXXXXXXXXXXX.event.ThumbEvent;
import mx.events.FlexEvent;
protected function image_completeHandler(event:Event):void
{
ConsoleUtils.logIt(" ThumbImage.mxml :image_completeHandler - ");
image.removeEventListener(Event.COMPLETE, image_completeHandler);
fadeIn.target=image;
fadeIn.play();
}
protected function clickHandler(event:MouseEvent):void
{
owner.dispatchEvent(new ThumbEvent("itemclick", data, itemIndex));
}
protected function rollOverHandler(event:MouseEvent):void
{
owner.dispatchEvent(new ThumbEvent("itemrollover", data, itemIndex));
}
protected function rollOutHandler(event:MouseEvent):void
{
owner.dispatchEvent(new ThumbEvent("itemrollout", data, itemIndex));
}
protected function itemrenderer1_removedFromStageHandler(event:Event):void
{
this.removeEventListener(Event.REMOVED_FROM_STAGE, itemrenderer1_removedFromStageHandler);
this.removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
this.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
this.removeEventListener(MouseEvent.CLICK, clickHandler);
this.removeAllElements();
}
protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void
{
this.removeEventListener(FlexEvent.CREATION_COMPLETE, itemrenderer1_creationCompleteHandler);
image.source="test.png";
//image.addEventListener(Event.COMPLETE, image_completeHandler);
}
]]>
</fx:Script>
<fx:Declarations>
<s:Fade id="fadeIn"
alphaFrom="0"
alphaTo="1"/>
</fx:Declarations>
<s:BitmapImage id="image"
horizontalAlign="center"
smooth="true"
smoothingQuality="high"
verticalAlign="middle"/>
</s:ItemRenderer>
分析快照
如您所见,在概要文件中,我有 21 个不会回收的孤立对象,概要文件显示我保存在第 12 行,而第 12 行是 creation_complete 事件,我已将其删除.
提前致谢
我已经使用 DataGroup
作为父组件并且我已经在 DataGroup
的 itemRenderer
属性 上面定义了 itemRenderer,并且在 dispose 函数中我已经定义了 DataGroup.itemRenderer
在 DataGroup
中为空。所以它将有资格获得GC。我看到现在内存中没有 itemRenderer 的实例。