2011-06-04 74 views
3

我有一個關於星火DataGrid的問題,以及如何在垃圾收集 方面的工作。什麼我發現是,如果我動態從DataGrid在運行時添加和刪除列 的GridColumns和itemRenderer的永遠不會釋放從內存 。星火Datagrid的內存使用情況

例如,如果我有一個包含10個項目的列表,並且我創建了10個列,則 是100個ItemRenderer和10個GridColumns。如果我刪除所有的列,他們仍然在那裏 。

如果我添加5列回來,它不會出現實例更GridColumns或 的itemRenderer - 仍有100個總渲染器以及內存10列。

這並不與MX DataGrid的發生。由於列被刪除的 渲染器和和DataGridColumns也會從內存中釋放,當我在 探查一下之後,我看到了0項渲染器和1周的DataGridColumn。

沒有任何人有什麼會被這裏發生了什麼想法?或者我只是 缺少什麼?

這裏是我用來測試的Spark DataGrid中的代碼:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> 
    <fx:Declarations> 
     <s:ArrayList id="dp"> 
      <fx:Object label="label 1"/> 
      <fx:Object label="label 2"/> 
      <fx:Object label="label 3"/> 
      <fx:Object label="label 4"/> 
      <fx:Object label="label 5"/> 
      <fx:Object label="label 6"/> 
      <fx:Object label="label 7"/> 
      <fx:Object label="label 8"/> 
      <fx:Object label="label 9"/> 
      <fx:Object label="label 10"/> 
     </s:ArrayList> 
     <s:ArrayList id="columns"> 
      <s:GridColumn dataField="label"/> 
     </s:ArrayList> 
    </fx:Declarations> 
    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 
    <s:DataGrid dataProvider="{dp}" columns="{columns}" width="100%" height="100%"/> 

    <s:HGroup> 
     <s:Button label="Add Column" click="columns.addItem(new GridColumn('label'))"/> 
     <s:Button label="Remove Column" click="if(columns.length > 0) columns.removeItemAt(0)"/> 
    </s:HGroup> 
</s:Application> 
+0

「如果我有一個包含10個項目的10個項目的列表,並且我創建了10個列,那麼將有100個ItemRenderer」;這隻有在您的DataGrid顯示10行時才爲true。你是DataGrid顯示5行;然後你有50個itemRenderer。[注意:我不確定Spark DataGrid是否創建了所有的像MX DataGrid一樣的列;如果沒有,你可能會有更少的渲染器;根據顯示的列數) – JeffryHouser 2011-06-04 17:09:00

+0

+1,用於提供完整的可運行樣本。 – JeffryHouser 2011-06-04 17:10:25

回答

1

我還沒有機會看一下在Flex的DataGrid的4.5代碼,但我將他們使用object pooling想象用於項目渲染器。

數據網格是所有關於速度,什麼花費最多的時間通常是項目渲染器(尤其是實例)。爲了快速保持DataGrid,他們不會立即「銷燬」項目渲染器。它會持續x時間;或者對於某些對象池算法,從不釋放它們。將它們保存在內存中會更容易,因爲它們並不是首要的巨大,並且具有更快的動態DataGrid。

其實,我做了一個快速谷歌搜索和I was right

所有這些數據網格IFactory的皮膚 部分必須是 IVisualElements的。在許多情況下,他們只是 像GraphicElements或Rects線 ,它可以相當有效地 因爲呈示了Flex運行時的 「顯示對象共享」支持使用 單一的DisplayObject,使它們的所有 。就像項目渲染器, 這些視覺元素內部 彙集和回收,以避免成本 創建和添加他們當 DataGrid中滾動。

似乎項目渲染器不僅彙集在每個DataGrid中,而且彙總到所有DataGrid中。非常好的做法,我不得不說。相信我,這是對DataGrid中的Flex的性能是非常有益的。

0

我beleive的回答你的問題是「useVirtualLayout」屬性。

您可以將容器配置爲使用虛擬佈局,而不是爲每個子項創建項呈示器。使用虛擬佈局,容器重用項目渲染器,以便>它僅爲容器的當前可見子項創建項目渲染器。當一個孩子從屏幕上移開時,可能通過滾動容器,一個正在滾動到屏幕上的新孩子可以重用其項目渲染器。

要將容器配置爲使用虛擬佈局,請將與容器關聯的佈局的useVirtualLayout屬性設置爲true。只有佈局設置爲VerticalLayout,Horizo​​ntalLayout或TileLayout的DataGroup或SkinnableDataContainer支持虛擬佈局。不支持虛擬化的佈局子類必須防止改變這種prope。」

來源:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/layouts/supportClasses/LayoutBase.html#useVirtualLayout

編輯:剛剛發現DataGrid中只支持VirtualLayouts,因爲它使用了自定義的‘網格佈局’所以,也許這不是你的問題的答案