懒惰和延迟的TreeViewer问题

时间:2009-11-24 20:48:28

标签: eclipse swt jface treeviewer

我实际上有两个问题,但它们有点相关,所以在这里它们就像一个......

如何使用TreeViewerSWT.VIRTUAL)和ILazeTreeContentProvider确保当前未显示的树节点的垃圾回收? 如果一个节点有5000个孩子,一旦他们被观众显示,他们永远不会放手, 因此,如果您的树具有大量节点和叶子且堆大小不够大,则会出现内存不足错误。 是否有某种最佳实践如何避免内存泄漏,这是由于从未关闭的视图持有一个包含大量数据的树视图(数十万个对象甚至数百万)? 或许可能有一些回调接口允许查看器/内容提供者元素具有更大的灵活性?

是否可以将单个DeferredTreeContentManagerILazyTreeContentProvider)的deffered(TreeViewer)和lazy(SWT.VIRTUAL)加载组合起来? 通过查看示例和API,我可以理解,只能在给定时间使用任何一个,但不能同时使用两个,例如, 仅获取给定节点的可见子节点,并使用Job API在单独的线程中获取它们。困扰我的是延迟方法 加载所有孩子。虽然在不同的线程中,你仍然加载所有元素 即使一次只显示一个最小子集。

如果需要,我可以为我的问题提供代码示例......

我目前正在努力解决这些问题,所以如果我能在此期间找到一些东西,我很乐意在这里分享。

谢谢!

此致 Svilen

1 个答案:

答案 0 :(得分:11)

我发现Eclipse框架有时是精神分裂症。我怀疑与DeferredTreeContentManager相关的ILazyTreeContentProvider就是其中一种情况。

在另一个例子中,在去年的EclipseCon上,他们建议您使用适配器工厂(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的不同团队实施,正处于向公共框架过渡的过程中。不过你是独自一人。