2016-04-13 5 views
0

Mein Problem ist das folgende: Ich arbeite mit 2 Plugins: nennen wir sie A und B. B kann jetzt einige Aktionen für den aktuellen Editor ausführen. Für diesen Punkt ist alles in Ordnung.
Der Parameter wird jedoch nur angegeben, wenn A instanziiert wird. Wenn sich der aktuelle Editor ändert, ist sich B nicht der Änderung bewusst.
ich versucht, ein Thema, von A begann zu verwenden, den aktiven Editor alle zwei Sekunden und wenn er in B. Problem bekommen: jedes Mal, =>Java: Wie bekomme ich den aktiven Editor in einem Thread?

java.lang.NullPointerException: while trying to invoke the method org.eclipse.ui.IWorkbenchWindow.getActivePage() of a null object returned from org.eclipse.ui.IWorkbench.getActiveWorkbenchWindow() 
at com.highdeal.tests.cortex.eclipse.RefreshThread.run(RefreshThread.java:14) 

Hier wird der Code des gestarteten Thread Nullpointer durch das Plugin A:

public class RefreshThread extends Thread { 

public void run(){ 
    while (true){ 
     try{ 
      Thread.sleep(1000); 
      IEditorPart iep = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
      new SampleAction(iep); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 
} 

}

Wenn ich das folgende Stück Code in den Konstruktor des Plugin A migrieren, funktioniert es richtig:

IEditorPart iep = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
new SampleAction(iep); 

Danke fürs Lesen. Fragen Sie mich, wenn Sie weitere Erklärungen benötigen.

+0

Ist SampleAction Ihr Plugin B? BTW dieses Codebeispiel ist nicht genug, um zu der Lösung zu kommen, aber das würde mich nicht davon abhalten zu sagen, dass dies eine sehr schlechte Art ist, Dinge zu tun. Sie sollten das Observer-Muster nachschlagen, was Sie in diesem Fall tun sollten. – Madhusudhan

+0

Sie haben recht, SampleAction mein Plugin B. Vielen Dank für die Informationen über Observer Pattern, ich werde einen Blick darauf werfen. Glücklicherweise führte mich eine der Antworten zu der Lösung. – MedAl

Antwort

1

PlatformUI.getWorkbench().getActiveWorkbenchWindow() gibt immer null zurück, wenn es von einem Hintergrundthread aufgerufen wird (das ist ein Thread, der nicht der UI-Thread ist).

Ein besserer Weg, dies zu tun, ist IPartListener zu verwenden, um auf den aktiven Teil zu warten, der geändert wird.

IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 

window.getPartService().addPartListener(part listener); 

(muss im UI-Thread ausgeführt werden).

Der Part-Listener wird über jedes aktivierte Teil informiert, und Sie können prüfen, ob es sich um einen neuen Editor handelt.

+0

Das funktioniert jetzt, danke. – MedAl

1

Um UI-Code in einem anderen Thread anstelle von UIThread auszuführen, verwenden Sie den Aufruf UIThreadSynchronizer oder Display.syncExec() \ asyncExec().

+0

Leider führt mich dieser Code zu etwas, das wie eine Endlosschleife aussieht. Vielleicht sollte ich überprüfen, wie meine Plugins kommunizieren, damit es funktioniert – MedAl

Verwandte Themen