从EContentAdapter更新UI的正确方法
问题描述:
我有一个econtent适配器,它本质上导致许多表的刷新。尽管从理论上讲,可以将所有通知过滤到应该引起表格刷新的确切通知,但由于我们有一个庞大的模型,以及可能触发一个或多个事件的许多不同事件和更改,这会非常困难和耗时刷新。此外,经常发生的情况是单个“用户事件”(例如,在应用程序中单击状态 - >新建),触发4个对象在幕后创建,所有这些对象与通知立场看起来非常相似,因此很难过滤掉。我想知道是否有一种好的方法来做某种“延迟工作”,这样4个通知只会导致一次刷新。例如,类似于:从EContentAdapter更新UI的正确方法
public void notifyChanged(final Notification notification)
super.notifyChanged(notification);
@Override
public void run() {
if(matchesFilters(notification)) {
//some sort of check to see if we recently had another event that would have triggered a refresh?
if(!schedulingJob) {
scheduleDelayedJob();
}
}
}
}
不幸的是我在工作之类的东西没有什么经验,所以这将是非常有益的,如果有人能够给什么这样做的正确的方法是提供援助。作为另一个例子,如果某人在我们的应用程序中非常迅速地碰到了20次控制-N,它将快速创建20个新状态,而我们只想在这20个通知结束时更新UI,而不是刷新20次。
答
如果我理解正确,Eclipse为您提供了所需的全部功能。首先,应该在显示线程上更新GUI。其次,有一种异步执行的方法,如下所示:
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().asyncExec(new Runnable() {
public void run() {
// Do your thing, e.g. refresh()
}
});
你在Runner中做什么取决于GUI框架。如果您使用的是JFace,那么您可以执行刷新(),我相信这对于排队工作非常明智。
不完全是我的意思,虽然这仍然有帮助。基本上,你上面的解决方案仍然会导致“我的事情”,例如如果20个通知在1秒内下降到管道上,refresh()会发生20次。基本上我正在寻找一些延迟“刷新”一段时间的东西,这样如果用户非常快速地执行操作,最终不会出现刷新的日志堵塞。 – jekelija 2013-04-25 12:03:40