Eclipse plugin 启动:频繁;BundleException:状态更改正在进行”;

Eclipse plugin 启动:频繁;BundleException:状态更改正在进行”;,eclipse-plugin,eclipse-rcp,Eclipse Plugin,Eclipse Rcp,我需要在我的插件中听取透视图状态的变化,我正在IStartup中进行这项工作 public void earlyStartup() { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { // register perspective listener to workbench } }); } 在一个新的工作区中启动IDE,在插件更新之后,我经常看到下面的异常 !

我需要在我的插件中听取透视图状态的变化,我正在IStartup中进行这项工作

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

在一个新的工作区中启动IDE,在插件更新之后,我经常看到下面的异常

!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 

有什么建议吗?

我建议最好在透视工厂插件激活器类start()方法中调用。这将避免你所面临的错误

在start()方法的末尾调用此函数。这不会影响插件加载的性能

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

最后,在bundle启动后,我将使用我的BundleListener注册监听器,如“IWindowCloseHandler”和“IPerspectiveListener”等

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

这就解决了类加载问题。

你的插件激活器
启动方法有什么作用吗?是的,它完成了一些任务。但是它们都不耗时。建议在BundleListener中添加透视侦听器吗?Hi Kondal,谢谢你的建议!你能解释一下这在插件加载序列中什么时候起作用吗?这会让你明白-我已经在start()的末尾添加了UIJob,但我怀疑该作业是否正在运行!在runInUIThread()开始处放置的断点永远不会命中!!也通过放置打印语句进行检查,作业已安排但从未运行。我有什么遗漏吗?不可能!。我相信插件本身不会被调用。在start()中放置一个调试点,并查看它是否被调用。start(上下文){…Job Job=new UIJob(“添加透视侦听器”){public IStatus runInUIThread(IProgressMonitor monitor){logInfo(“作业运行”);addPerspectiveListener();return Status.OK_Status;};Job.setSystem(true);logInfo(“JOB scheduled”);JOB.schedule();}插件已被调用,并且“JOB scheduled”已打印在日志中,但在日志中找不到“JOB running”,即使在我的插件开始运行之后!!