RCP开发中错误:java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part...

本文讨论了在使用Eclipse开发Gluster存储管理控制台插件时遇到的重复激活视图导致的运行时异常问题,并提供了两种解决方案:一种是使用Display的异步执行来等待当前焦点事件完成,另一种是查找并移除导致视图重复激活的代码。通过应用这些解决方案,可以有效避免异常发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做RCP的eclipse插件开发时,启动管理软件界面时,总是报如下错误 :

!ENTRY org.eclipse.ui.workbench 4 0 2012-05-25 18:44:21.306
!MESSAGE WARNING: Prevented recursive attempt to activate part org.gluster.storage.management.console.views.ClusterSummaryView while still in the middle of activating part org.gluster.storage.management.console.views.NavigationView
!STACK 0
java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part org.gluster.storage.management.console.views.ClusterSummaryView while still in the middle of activating part org.gluster.storage.management.console.views.NavigationView
 at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3586)
 at org.eclipse.ui.internal.WorkbenchPage.internalActivate(WorkbenchPage.java:691)
 at org.eclipse.ui.internal.WorkbenchPage.activate(WorkbenchPage.java:663)
 at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:1170)
 at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:1147)
 at org.eclipse.ui.internal.WorkbenchPage$20.run(WorkbenchPage.java:3921)
 at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
 at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:3918)
 at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:3894)
 at org.gluster.storage.management.console.views.GlusterViewsManager.showViewsForCluster(GlusterViewsManager.java:82)
 at org.gluster.storage.management.console.views.GlusterViewsManager.updateViews(GlusterViewsManager.java:53)
 at org.gluster.storage.management.console.views.NavigationView.selectionChanged(NavigationView.java:142)
 at org.eclipse.ui.internal.AbstractSelectionService.fireSelection(AbstractSelectionService.java:156)
 at org.eclipse.ui.internal.AbstractSelectionService.setActivePart(AbstractSelectionService.java:282)
 at org.eclipse.ui.internal.WorkbenchPagePartList.fireActivePartChanged(WorkbenchPagePartList.java:60)
 at org.eclipse.ui.internal.PartList.setActivePart(PartList.java:136)
 at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3636)
 at org.eclipse.ui.internal.WorkbenchPage.internalActivate(WorkbenchPage.java:691)
 at org.eclipse.ui.internal.WorkbenchPage.activate(WorkbenchPage.java:663)
 at org.eclipse.ui.internal.WorkbenchPage.makeActive(WorkbenchPage.java:1324)
 at org.eclipse.ui.internal.WorkbenchPage.updateActivePart(WorkbenchPage.java:1304)
 at org.eclipse.ui.internal.WorkbenchPage.updateVisibility(WorkbenchPage.java:3779)
 at org.eclipse.ui.internal.WorkbenchPage.onActivate(WorkbenchPage.java:2715)
 at org.eclipse.ui.internal.WorkbenchWindow$27.run(WorkbenchWindow.java:3023)
 at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
 at org.eclipse.ui.internal.WorkbenchWindow.setActivePage(WorkbenchWindow.java:3004)
 at org.eclipse.ui.internal.WorkbenchWindow.busyOpenPage(WorkbenchWindow.java:799)
 at org.eclipse.ui.internal.Workbench$23.runWithException(Workbench.java:1224)
 at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
 at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)
 at org.eclipse.ui.internal.Workbench$33.runWithException(Workbench.java:1595)
 at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
 at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
 at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
 at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
 at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
 at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
 at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
 at org.gluster.storage.management.console.Application.start(Application.java:100)
 at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
 at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
 at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
 at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

之前一直不知道错误原因,在网上查了一下,解决办法有几个 ,

1.New focus event is run while other focus event was executing and therefore not finished yet.
You have to override setFocus() or find a good place and put this inside your code:

Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                while (Display.getDefault().readAndDispatch()) {
                    //wait for events to finish before continue
                }
                // your code for focus here
                // e.g. table.forceFocus()
            }
});


So Display will wait until current focus event is finish, and then will execute new focus event.


根据我的测试,上面的代码中,去掉 
while (Display.getDefault().readAndDispatch()) {
    //wait for events to finish before continue
}

这段也是一样可以的


2.  I just found that one of my colleagues add a PartListener to the part service. When an activated part was adaptable to the IContentOutlinePage, the listener activates the ContentOutline view, so it get also the focus. This was the reason of the exception.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值