2016-12-27 9 views
0

私には1つの状況があります。今UIアクセスのEclipseジョブ

public void methodForExecution(){ 
    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("view_id"); 
} 

、状況は、ジョブがいるProgressMonitorのようなものを開き、:)

private class ExecutionJob extends Job { 
    public static final String MY_FAMILY = "myJobFamily"; 

    public ExecutionJob(String name) { 
     super(name); 
    } 

    @Override 
    protected IStatus run(IProgressMonitor monitor) { 
     monitor.beginTask("executing ...... ", IProgressMonitor.UNKNOWN); 
     methodForExecution(); 
     monitor.done(); 
     return Status.OK_STATUS; 
    } 

    @Override 
    public boolean belongsTo(Object family) { 
     return family == MY_FAMILY; 
    } 
} 

そして、このmethodForExecution(以下のようなコードをしています 私は、次のコードで1つのEclipseの仕事をしています私の方法は実際にこの仕事の進行モニターの背後にあるUIにアクセスしようとしています。また、進行状況モニタにActiveWorkbenchWindowがないため、NullPointerExceptionが発生します。

このmethodForExecution()を非同期で実行する必要があるため、私はUIJobを使用できません。 誰かがこれを解決するのを手伝ってもらえますか?

答えて

2

あなたは必須にUIのthead要素で実行を実行するコード。

ジョブの作業のほとんどがUIを更新しており、長時間実行される非UIコードがない場合は、UIJobを使用してこれを実行する必要があります。これはまだジョブとしてスケジュールされていますが、runInUIThreadメソッドはUIスレッドで実行されます。

あなたは非UIコード、特に長時間実行されるコードの多くを持っている場合は、通常のJobを使用していますが、UIスレッドでメソッドを実行するためにDisplay.asyncExecを使用する必要があります:Javaの8で

Display.getDefault().asyncExec(new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     methodForExecution(); 
    } 
    }); 

あなたは行うことができます:あなたはまた、UIを更新するのを待つのではなくasyncExecsyncExecを使用することができます

Display.getDefault().asyncExec(this::methodForExecution); 

showViewをすべて実行したい場合は、Jobを使用せずにasyncExecを実行します。

+0

UIJobを使用中にこのhttp://stackoverflow.com/questions/19325603/eclispe-does-not-show-progress-bar-of-user-threadsの問題に直面しています – Rajan

+0

あなたが行っていることがすべて表示されている場合ジョブが非常に速く終了し、進行状況バーを表示する時間がありません –

+0

UIJobまたは通常のジョブをいつ使用するかを明示するように答えを更新しました。 –

関連する問題