2009-11-24 62 views
9

我有實際上是兩個問題,但他們那種關係所以在這裏他們去爲一體的...懶惰和遞延的TreeViewer問題

如何確保當前未使用的TreeViewer顯示樹節點的垃圾收集(SWT.VIRTUAL)和ILazeTreeContentProvider? 如果一個節點有5000個子節點,一旦它們被查看者顯示出來,它們就永遠不會被釋放,因此,如果你的樹有很多節點和樹葉並且堆的大小不夠大,內存就會出錯。 是否有某種最佳實踐如何避免內存泄漏,由永不閉合的視圖持有大量的數據(數十萬對象甚至數百萬)樹視圖? 也許可能有一些回調界面可以讓觀看者/內容提供者元素具有更大的靈活性?

是否可以結合對單個TreeViewerSWT.VIRTUAL)的加載(DeferredTreeContentManager)和延遲(ILazyTreeContentProvider)? 就我所知,通過查看示例和API,只能在給定時間使用任一個,但不能同時使用兩個,例如, , 僅獲取給定節點的可見子項,並使用Job API在單獨的線程中獲取它們。讓我困擾的是,延期方法 加載所有孩子。儘管在不同的線程中,您仍然會加載所有元素 ,即使只有最小的子集一次顯示。

我可以提供代碼示例我的問題,如果需要......

我目前正在與那些掙扎自己,所以如果我設法拿出與此同時東西我會很樂意在這裏分享。

謝謝!

問候, Svilen

+0

對於延遲加載,查看者向提供者報告將顯示特定元素(由於滾動或展開)。使用內容提供者方法中的作業可以輕鬆實現當前的延遲實現。 兩種方法都存在問題,爲什麼它們可能是獨佔的:延遲加載假定您事先知道元素數,並在內容顯示時替換查看器的內容。您不希望加載內容(例如,從遠程資源),每次用戶滾動或擴展某些內容時。 – benez 2015-08-26 20:31:14

回答

11

我發現Eclipse框架有時精神分裂症。我懷疑DeferredTreeContentManager,因爲它涉及ILazyTreeContentProvider是這些情況之一。

在另一個示例中,在過去的一年裏,他們建議您使用適配器工廠(IAdapterFactory)來調整模型以適應當時所需的綁定上下文。例如,如果你想讓你的模型出現在樹中,就這樣做。

treeViewer = new TreeViewer(parent, SWT.BORDER); 
IAdapterFactory adapterFactory = new AdapterFactory(); 
Platform.getAdapterManager().registerAdapters(adapterFactory, SomePojo.class); 
treeViewer.setLabelProvider(new WorkbenchLabelProvider()); 
treeViewer.setContentProvider(new BaseWorkbenchContentProvider()); 

註冊您的適配器和BaseWorkbenchContentProvider會發現在工廠的適應。精彩。聽起來像是個計劃。

「哦由這路,當你有大量的數據集,請不要這樣說」,他們說:

TableViewertableViewer = new TableViewer(parent, SWT.VIRTUAL); 
// skipping the noise 
tableViewer.setItemCount(100000); 
tableViewer.setContentProvider(new LazyContentProvider()); 
tableViewer.setLabelProvider(new TableLabelProvider()); 
tableViewer.setUseHashlookup(true); 
tableViewer.setInput(null); 

事實證明,第一和第二個例子不僅是不相容的,但他們互相排斥。這兩種方法可能由不同的團隊實施,這些團隊沒有一個共同的計劃或者API可能正在過渡到一個通用框架。儘管如此,你仍然是你自己的。

+4

這是一個很好的答案!你把它很好地展示出來 - 當涉及到在同一時間使用懶惰和延遲加載時,jface API本身是相矛盾的。這是一個恥辱。也許可以提出基於SWT的解決方案,自己處理多線程,但是我真的希望這兩個團隊在休息時間偶然遇到了,並且認爲「你知道,結合這兩種方法是有意義的,並且會增加爲我們的API增加額外價值。「可能不會。 :( – Svilen 2009-11-26 08:51:00