Svi*_*len 9 eclipse swt jface treeviewer
我实际上有两个问题,但它们有点相关,所以在这里它们一样......
如何使用TreeViewer(SWT.VIRTUAL)和ILazeTreeContentProvider?确保当前未显示的树节点的垃圾收集?如果一个节点有5000个子节点,一旦它们被观众显示,它们就永远不会被释放,因此如果你的树有大量的节点和叶子而且堆大小不够大,那么内存不足就会出错.是否有某种最佳实践如何避免内存泄漏,这是由于从未关闭的视图持有一个包含大量数据的树视图(数十万个对象甚至数百万)?也许有一些回调接口可以让观众/内容提供商提供更大的灵活性?
是否可以将deffered(DeferredTreeContentManager)和lazy(ILazyTreeContentProvider)加载组合为单个TreeViewer(SWT.VIRTUAL)?通过查看示例和API,我可以理解,只能在给定时间使用任何一个,但不能同时使用两者,例如,仅获取给定节点的可见子节点并使用Job在单独的线程中获取它们API.困扰我的是Deferred方法加载所有孩子.虽然在不同的线程中,您仍然会加载所有元素,即使一次只显示最小子集.
如果需要,我可以为我的问题提供代码示例...
我现在正在与自己挣扎,所以如果我能在此期间拿出一些东西,我很乐意在这里分享.
谢谢!
此致,Svilen
and*_*nka 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());
Run Code Online (Sandbox Code Playgroud)
注册适配器,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);
Run Code Online (Sandbox Code Playgroud)
事实证明,第一个和第二个例子不仅不相容,而且它们是相互排斥的.这两种方法可能由不具有共同计划或API的不同团队实施,正处于向公共框架过渡的过程中.不过你是独自一人.