2016-12-27 2 views
0

Ich habe eine Situation. Ich habe eine Eclipse-Job mit folgenden Code:Eclipse-Job mit UI-Zugriff

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; 
    } 
} 

Und diese methodForExecution() hat Code wie folgt:

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

Nun ist die Situation, Job öffnet so etwas wie Progress auf und Meine Methode versucht, auf die Benutzeroberfläche zuzugreifen, die tatsächlich hinter dem Fortschrittsmonitor dieses Jobs steht. Und es gibt NullPointerException, da der Fortschrittsmonitor ActiveWorkbenchWindow nicht enthält.

Ich kann UIJob nicht verwenden, da ich diese methodForExecution() asynchron ausführen muss. Kann mir bitte jemand helfen, dies zu lösen.

Antwort

2

Der Code, den Sie ausführen möchten muss in der UI thead ausführen.

Wenn die meiste Arbeit in dem Job die Benutzeroberfläche aktualisiert und es keinen lang laufenden Code ohne UI gibt, sollten Sie UIJob verwenden, um dies auszuführen. Dies ist immer noch als Job geplant, aber die runInUIThread Methode wird im UI-Thread ausgeführt.

Wenn Sie eine Menge von nicht-UI-Code besonders langen Code ausgeführt werden dann ein normales Job verwenden, aber Sie müssen Display.asyncExec verwenden, um das Verfahren in dem UI-Thread ausgeführt wird:

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

In Java 8 Sie tun könnte:

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

Sie auch syncExec statt asyncExec zu warten, bis die Benutzeroberfläche aktualisieren können.

Wenn die showView alles ist, was Sie tun möchten, können Sie einfach die asyncExec ohne eine Job verwenden.

+0

Ich stehe damit http://stackoverflow.com/questions/19325603/eclispe-does-not-show-progress-bar-of-user-threads Problem bei der Verwendung von UIJob – Rajan

+0

Wenn alles, was Sie tun, ist eine Show-Ansicht Der Job wird sehr schnell fertig sein und keine Zeit haben, einen Fortschrittsbalken anzuzeigen. –

+0

Ich habe die Antwort aktualisiert, um deutlicher zu machen, wann ich UIJob oder einen normalen Job verwenden soll. –