懒惰和递延TreeViewer中的问题
-
22-09-2019 - |
题
我其实是两个问题,但他们是那种关系所以在这里他们去为一体的...
如何确保当前未显示树节点的垃圾回收利用TreeViewer
(SWT.VIRTUAL
)和ILazeTreeContentProvider
?
如果一个节点有5000名儿童,一旦被观众展示他们绝不放过,
因此内存不足错误的,如果你的树有节点和叶子和不够大堆大小的大量。
是否有某种最佳实践如何避免内存泄漏,造成永远闭上观点持非常大量的数据(几十万对象甚至上百万的)一个TreeViewer中?
或许也许有一些回调接口,其允许与阅读器/内容提供商元件更大的灵活性?
是否有可能递延(DeferredTreeContentManager
)AND懒惰(ILazyTreeContentProvider
)装载合并为一个单一的TreeViewer
(SWT.VIRTUAL
)?
虽然我通过看实例和API的理解,只可能使用一个在给定时间而不是两者结合,例如,
只获取可见孩子给定节点和使用工作API在一个单独的线程获取它们。让我困扰的是,递延方式
装载所有的孩子。虽然在不同的线程,则它仍然加载的所有元素
即使只有一个小子集被同时显示。
我可以提供代码示例如果需要我的问题...
我目前正在与那些挣扎自己,所以如果我设法拿出与此同时东西我会很乐意在这里分享。
谢谢!
此致 Svilen
解决方案
我找到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是在一个共同的框架过渡的中间。但是你对你自己的。