在我的Eclipse插件中,有一个显示某些数据的TableViewer
。这些数据是从远程REST服务检索的。因此,检索所有项目需要花费几秒钟。这就是为什么我想在检索到它们后立即将它们添加到TableViewer
的ContentProvider
中的原因。我在单独的线程中执行REST查询:
Thread retrieveThread = new RetrieveThread();
retrieveThread.run();
在此线程中,我将项目添加到我的
TableViewer
中:MyView.instance.addItems(items);
和类
MyView
中的相同方法:public void addItems(List<Result> items) {
ModelProvider.INSTANCE.addItems(items);
resultLabel.setText(ModelProvider.INSTANCE.getItems().size() + " items");
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
viewer.refresh();
}
});
}
我希望此过程会将项目添加到我的
TableViewer
中,然后刷新视图。但是现在发生的是,我的Eclipse冻结并同时添加了所有项目。我该如何以更快速的方式执行此操作? 最佳答案
问题是您正在直接调用线程的run
方法。这不会产生新的线程,它只是内联调用run方法。 retrieveThread.start()
将为您提供所需的行为。
但是,有一种更好的方法(至少对“ Eclipse友好”),那就是使用Eclipse Job
代替原始的Thread
。
Job retrieveJob = new Job("Retrieving Data")
{
@Override
protected IStatus run(IProgressMonitor monitor) {
// do your REST call
ModelProvider.INSTANCE.addItems(items);
// if something goes wrong - don't return ok, obviously
return Status.OK_STATUS;
}
};
retrieveJob.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if(event.getResult().isOK())
{
resultLabel.setText(ModelProvider.INSTANCE.getItems().size() + " items");
viewer.refresh();
}
}
});
// this will run in a background thread
// and nicely integrate with the UI
retrieveJob.schedule();
关于java - Eclipse插件:如何异步将项目添加到TableViewer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10562740/