RCP 工程打开时异常信息:
Job found still running after platform shutdown. Jobs should be canceled by the plugin that scheduled them during shutdown: ... ...
-----------------------------
分析发现时程序用的一个UIJob,在workbench非正常关闭时,UIJob还在运行,于是就有了上面的异常,替换成WorkbenchJob,就会正常。
-------
WorkbenchJob时一个专门的UIJob类,和UIJob的主要区别:在允许作业被调度和运行前,WorkbenchJob检测Workbench是否正在运行。
WorkbenchJob它使用作业更改监听器来确保:当作业已经完成时,在WorkbenchJob中包含的preformDone方法也被调用。
WorkbenchJob是UIJob的一种更安全的形式。WorkbenchJob会自己检测Workbench是否在运行,当Workbench关闭时,WorkbenchJob强制终止用户界面的更新。
WorkbenchJob源码贴一下:(关键是本身对PlatformUI.isWorkbenchRunning()的调用)
public abstract class WorkbenchJob extends UIJob {
public WorkbenchJob(Display jobDisplay, String name) {
super(jobDisplay, name);
addDefaultJobChangeListener();
}
public WorkbenchJob(String name) {
super(name);
addDefaultJobChangeListener();
}
private void addDefaultJobChangeListener() {
addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
//Abort if it is not running
if (!PlatformUI.isWorkbenchRunning()) {
return;
}
if (event.getResult().getCode() == IStatus.OK) {
performDone(event);
}
});
}
public void performDone(IJobChangeEvent event) {
//Do nothing by default.
}
public boolean shouldSchedule() {
return super.shouldSchedule() && PlatformUI.isWorkbenchRunning();
}
public boolean shouldRun() {
return super.shouldRun() && PlatformUI.isWorkbenchRunning();
}
}