Java TreeViewer仅延迟加载图标
我有一个TreeViewer,它显示项目列表。我的限制如下:Java TreeViewer仅延迟加载图标,java,eclipse,eclipse-plugin,swt,eclipse-rcp,Java,Eclipse,Eclipse Plugin,Swt,Eclipse Rcp,我有一个TreeViewer,它显示项目列表。我的限制如下: 每个项都表示为磁盘上的一个XML文件 每个XML文件的文件名是图标的标签('hello.XML'->树中的'hello'项) 每个XML文件都有一个“类型”,存储在XML中,它表示每个项目的图像 当我为by TreeViewer项执行getChildren()时,我读取每个XML文件并从中生成Object[]数组。直到最近,这一点还是可以接受的,但现在已经不是了。XML文件的正常数量是10个,现在是500个 我需要提高表现。然而,
- 每个项都表示为磁盘上的一个XML文件李>
- 每个XML文件的文件名是图标的标签('hello.XML'->树中的'hello'项)
- 每个XML文件都有一个“类型”,存储在XML中,它表示每个项目的图像
- 无法更改XML文件的格式(即使用数据库、序列化对象..)
- 无法创建XML文件的其他表示形式
- 无法更改XML文件的名称(即“hello.XML”->“hello type.XML”
- 使用DeferredTreeContentManager-之所以不这样做是因为我希望首先快速地获得名称,图像可以按照自己的速度后续
- 一次对所有项目执行update()/批处理项目-这会锁定GUI,比许多单独的update()更糟糕
尝试通过调用来降低后台线程的优先级
this.setPriority(this.getPriority()-1);
在线程中
对asyncExec
的500次调用不应使GUI无响应,如果它们所做的只是在TreeItem
中设置一个映像。要确保对TreeViewer.update
的调用便宜,请调用
TreeViewer.setUseHashlookup(true)
这可以有效地将元素映射到树元素。我建议在后台线程中一次加载/创建多个图像(从您所说的听起来,您至少可以在没有性能问题的情况下执行10次)。因此,您的线程看起来像:
// Load/Create some number of images...
Display.asyncExcec(new Runnable() {
public void run() {
getTreeViewer().setRedraw(false);
// Loop and call update on each node you loaded the image for
getTreeViewer().setRedraw(true);
}
});
如果我不清楚,很抱歉。该类型可以是5种类型中的1种,每种类型由一个图像表示。这5种图像中的每一种都已加载到ImageRegistry中。缓慢的是决定显示哪个图像,然后再显示它。接受TreeViewer。setUseHashlookup(true),这是我错过的一个明显的技巧。其他技术(如批处理)倾向于不提高绩效。