我实际上有两个问题,但它们有点相关,所以在这里它们就像一个......
如何使用TreeViewer
(SWT.VIRTUAL
)和ILazeTreeContentProvider
确保当前未显示的树节点的垃圾回收?
如果一个节点有5000个孩子,一旦他们被观众显示,他们永远不会放手,
因此,如果您的树具有大量节点和叶子且堆大小不够大,则会出现内存不足错误。
是否有某种最佳实践如何避免内存泄漏,这是由于从未关闭的视图持有一个包含大量数据的树视图(数十万个对象甚至数百万)?
或许可能有一些回调接口允许查看器/内容提供者元素具有更大的灵活性?
是否可以将单个DeferredTreeContentManager
(ILazyTreeContentProvider
)的deffered(TreeViewer
)和lazy(SWT.VIRTUAL
)加载组合起来?
通过查看示例和API,我可以理解,只能在给定时间使用任何一个,但不能同时使用两个,例如,
仅获取给定节点的可见子节点,并使用Job API在单独的线程中获取它们。困扰我的是延迟方法
加载所有孩子。虽然在不同的线程中,你仍然加载所有元素
即使一次只显示一个最小子集。
如果需要,我可以为我的问题提供代码示例......
我目前正在努力解决这些问题,所以如果我能在此期间找到一些东西,我很乐意在这里分享。
谢谢!
此致 Svilen
答案 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的不同团队实施,正处于向公共框架过渡的过程中。不过你是独自一人。