1

私の Eclipse プラグインには、TableViewerいくつかのデータを表示する があります。これらのデータは、リモート REST サービスから取得されます。したがって、すべてのアイテムを取得するには数秒かかります。そのため、アイテムを取得したらすぐにに追加したかったのTableViewerです。ContentProvider別のスレッドで REST クエリを実行します。

Thread retrieveThread = new RetrieveThread();
retrieveThread.run();

このスレッドでは、アイテムを my に追加します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 がフリーズし、それらすべての項目を同時に追加することです。より応答性の高い方法でこれを行うにはどうすればよいですか?

4

1 に答える 1

2

run問題は、スレッドのメソッドを直接呼び出していることです。これは新しいスレッドを生成せず、run メソッドをインラインで呼び出すだけです。retrieveThread.start()あなたが探している動作を提供します。

ただし、それを行うより良い方法 (少なくとも「Eclipse フレンドリー」) があり、それはJobraw の代わりにEclipse を使用すること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(); 
于 2012-05-12T18:35:12.650 に答える