9

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

如何确保对当前未使用TreeViewer( SWT.VIRTUAL) 和显示的树节点进行垃圾收集ILazeTreeContentProvider?如果一个节点有 5000 个子节点,一旦它们被查看器显示,它们就永远不会放手,如果你的树有大量节点和叶子并且堆大小不够大,则会出现内存不足错误。是否有某种最佳实践来避免由于从未关闭的视图持有具有大量数据(数十万个对象甚至数百万个对象)的树查看器而导致的内存泄漏?也许有一些回调接口允许查看器/内容提供者元素具有更大的灵活性?

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

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

我目前正在与这些人作斗争,所以如果我同时想出一些东西,我很乐意在这里分享。

谢谢!

问候,斯维伦

4

1 回答 1

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 可能正在过渡到共同框架。尽管如此,你还是靠自己。

于 2009-11-25T19:57:59.480 回答