【问题标题】:Lazy and Deferred TreeViewer questions惰性和延​​迟 TreeViewer 问题
【发布时间】:2009-11-24 20:48:27
【问题描述】:

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

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

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

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

我自己目前正在与这些问题作斗争,所以如果我能在此期间想出一些东西,我很乐意在这里分享。

谢谢!

问候, 恶魔

【问题讨论】:

  • 对于延迟加载,查看者向提供者报告将显示特定元素(由于滚动或展开)。当前的延迟实现可以使用内容提供者方法中的作业轻松实现。这两种方法的问题,为什么它们可能是独占的:延迟加载假设您事先知道元素计数,并在显示内容时替换查看器的内容。您不想在每次用户滚动或展开某些内容时加载内容(例如,从 remore 资源)。

标签: eclipse swt jface treeviewer


【解决方案1】:

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

在另一个例子中,在去年的 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 可能正在过渡到共同框架。尽管如此,你还是靠自己。

【讨论】:

  • 这是一个很好的答案!你说得很好 - jface API 本身在同时使用延迟加载和延迟加载时是矛盾的。这是一种耻辱。也许可以提出基于 SWT 的解决方案,自己处理多线程,但我真的希望这两个团队在喝咖啡的时候偶然相遇,并认为“你知道,结合这两种方法是有道理的,并且会添加为我们的 API 带来额外价值。”可能不会。 :(
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 2010-09-08
  • 2011-03-03
  • 1970-01-01
  • 2011-11-12
  • 2017-07-23
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多