【发布时间】:2009-11-24 20:48:27
【问题描述】:
我实际上有两个问题,但它们有点相关,所以在这里它们是一个......
如何确保使用TreeViewer(SWT.VIRTUAL) 和ILazeTreeContentProvider 对当前未显示的树节点进行垃圾回收?
如果一个节点有 5000 个子节点,一旦它们被查看器显示,它们就永远不会放开,
因此,如果您的树有大量节点和叶子并且堆大小不够大,则会出现内存不足错误。
是否有某种最佳实践来避免由于从未关闭的视图持有具有大量数据(数十万个对象甚至数百万个对象)的树查看器而导致的内存泄漏?
也许有一些回调接口可以让查看器/内容提供者元素具有更大的灵活性?
是否可以将延迟 (DeferredTreeContentManager) 和延迟 (ILazyTreeContentProvider) 加载组合为单个 TreeViewer(SWT.VIRTUAL)?
据我通过查看示例和 API 了解,只能在给定时间使用其中一个,但不能同时使用两者,例如,
仅获取给定节点的可见子节点,并使用 Job API 在单独的线程中获取它们。困扰我的是延迟方法
加载所有孩子。尽管在不同的线程中,你仍然会加载所有元素
即使一次只显示一个最小的子集。
如果需要,我可以为我的问题提供代码示例...
我自己目前正在与这些问题作斗争,所以如果我能在此期间想出一些东西,我很乐意在这里分享。
谢谢!
问候, 恶魔
【问题讨论】:
-
对于延迟加载,查看者向提供者报告将显示特定元素(由于滚动或展开)。当前的延迟实现可以使用内容提供者方法中的作业轻松实现。这两种方法的问题,为什么它们可能是独占的:延迟加载假设您事先知道元素计数,并在显示内容时替换查看器的内容。您不想在每次用户滚动或展开某些内容时加载内容(例如,从 remore 资源)。
标签: eclipse swt jface treeviewer