2016-04-13 4 views
1

Ich muss Perspektive Zustandsänderungen in meinem Plugin hören, die ich in IAnlauf tueStartup: Häufiges "BundleException: Zustandswechsel in progress"

public void earlyStartup() { 
    Display.getDefault().asyncExec(new Runnable() { 
    @Override 
    public void run() { 
    // register perspective listener to workbench 
    } 
}); 

}

IDE starten in einem neuen Arbeitsbereich , nach dem Plugin Update, sehe ich unten Ausnahme so häufig.

!MESSAGE While loading class "com.test.Startup", thread "Thread[Worker-2,5,main]" timed out waiting (5008ms) for thread "Thread[Thread-6,5,main]" to finish starting bundle "test.startup [55]". 
To avoid deadlock, thread "Thread[Worker-2,5,main]" is proceeding but "com.test.Startup" may not be fully initialized. 
!STACK 0 
org.osgi.framework.BundleException: State change in progress for bundle 

Irgendwelche Vorschläge?

+0

Hat Ihr Plugin Activator 'Start' Methode etwas tun? –

+0

Ja, es macht eine Aufgabe. Aber keiner von ihnen ist zeitaufwendig. – Priyadarshini

+0

Wird vorgeschlagen, den Listener in BündelListener hinzuzufügen? – Priyadarshini

Antwort

1

Schließlich bin ich mit meiner ‚BundleListener‘ Zuhörer registrieren wie ‚IWindowCloseHandler‘ und ‚IPerspectiveListener‘ usw., nachdem Bündel gestartet.

public class StudioBundleListener implements BundleListener { 
@Override 
    public void bundleChanged(BundleEvent event) { 
    String symbolicName = event.getBundle().getSymbolicName(); 
    int type = event.getType(); 
    if(symbolicName.equals(MYPlugin.PLUGIN_ID) && type == BundleEvent.STARTED) { 
    //Register my listeners 
    } 
} 
} 

Dies löste das Klassenproblem.

0

Ich würde vorschlagen, es ist besser, mit in Ihrer Perspective factory Plugin Activator Klasse start() -Methode aufzurufen. Das wird die Fehler vermeiden, mit denen Sie konfrontiert sind.

Rufen Sie dies am Ende der Methode start() auf. Dies hat keinen Einfluss auf die Performance des Ladens des Plugins.

Job job = new UIJob("Add Perspective listener") { 
    public IStatus runInUIThread(IProgressMonitor monitor) { 
     addPerspectiveListener(); 
     return Status.OK_STATUS; 
    } 
}; 
job.setSystem(true); 
job.schedule(); 
+0

Hallo Kondal, Vielen Dank für Ihren Vorschlag! Könntest du bitte erklären, wann genau das in der Plugin-Lade-Sequenz ins Spiel kommt? – Priyadarshini

+0

Dies wird Sie verstehen - http://exploreeclipse.blogspot.sg/search?q=State+change+in+progress+for+bundle+ –

+0

Ich habe die UIJob am Ende des Start() hinzugefügt, aber ich bezweifle, dass der Job ist Laufen! Der Breakpoint, der beim Start von runInUIThread() gesetzt wird, wird nie getroffen !! Außerdem wird der Job zwar durch das Setzen von print-Anweisungen überprüft, aber der Job ist geplant, wird aber nie ausgeführt. Gibt es etwas, was mir fehlt? – Priyadarshini