SWTException在Eclipse插件开发中是比较常见的异常,初遇之时,比较头疼,现将解决办法总结一下。
RootCause
Eclipse是基于SWT框架的。SWT实现了一个被称为单元线程(apartment threading)的UI模型,SWT严格要求UI操作只能由UI线程调用,如果用户企图在非UI线程中访问SWT组件,就会收到“org.eclipse.swt.SWTException: Invalid thread access”异常。
解决方案
SWT为了兼顾非UI线程中对UI组件的访问,提供了以下两种方式(也是唯一的两种方式):
-
syncExec(Runnable runnable)
这样导致非UI线程等待runnable完成 -
asyncExec(Runnable runnable)
允许非UI线程继续执行而非等待runnable完成display.syncExec( new Runnable() { public void run(){ label.setText(text); } });
举例
比如,在某个线程的回调方法中,需要弹出对话框提示用户,可以这样做:
public void callback() {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
MessageDialog.openError(getShell(),
"title","Error!");
}
});
}
这里使用的是同步调用,当然还有异步方式可用,但SWT推荐使用前者,因为这样更接近java方法调用(即获得结果前总是等待method执行完毕)。
此外,Display还有个getCurrent()可用,实际编码时可根据情况选择之。
Reference
(end)
网友评论