2012-05-12 7 views
1

私のEclipseプラグインでは、いくつかのデータを表示するTableViewerがあります。これらのデータは、リモートRESTサービスから取得されます。したがって、すべてのアイテムを取得するのに数秒かかる。だから、私はそれらを取得するとすぐにTableViewerContentProviderにアイテムを追加したかったのです。私は私のTableViewerに項目を追加し、このスレッドでEclipseプラグイン:TableViewerに項目を非同期で追加するにはどうすればいいですか?

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

:私は別のスレッドで私のRESTクエリを行う

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はフリーズして、それらのアイテムをすべて同時に追加します。どのようにこれをより反応的な方法で行うことができますか?

+0

ここで、RetrieveThreadとMyViewのソースコードを追加できますか? – nnhthuan

答えて

2

問題は、スレッドのrunメソッドを直接呼び出すことです。これは、新しいスレッドを生成するわけではなく、runメソッドをインラインで呼び出すだけです。 retrieveThread.start()はあなたが探している行動を与えるでしょう。

しかし、これを行うにはもっと良い方法があります。少なくともThreadの代わりにJobというEclipseを使用することです。

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(); 
関連する問題