在我的Eclipse插件中,有一个显示某些数据的TableViewer。这些数据是从远程REST服务检索的。因此,检索所有项目需要花费几秒钟。这就是为什么我想在检索到它们后立即将它们添加到TableViewerContentProvider中的原因。我在单独的线程中执行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/

10-11 16:12