一:基本概念
在SWT内,有一个UI主线程的概念,自定义的线程不可操作UI控件,如果要操作则必须使用
display.asyncExec(new Runnable() {
public void run() {
// UI操作
}
});
需要注意的是:在Display.asyncExec()方法内运行的线程就是UI主线程,而不是用户自定义的线程。通过简单的实验可以知道,可见附件。
二:Display.asyncExec与Display.syncExec
display.asyncExec(new Runnable() {
public void run() {
// UI操作
}
});
Display.asyncExec()方法,下面的代码可以继续执行,而不用等到Display.asyncExec()的完成。
display.syncExec(new Runnable() {
public void run() {
// UI操作
}
});
Display.syncExec()方法,会让在下面的代码进入等待,需要等到Display.syncExec()的完成才可以继续向下执行。
三:Job与UIJob
1. Job与UIJob都必须工作在eclipse环境下,也就是Eclipse或RCP环境下。
2. 提供了进度条,子任务,状态等功能。
3. UIJob extends Job,UIJob是对Job的简单封装,使得任务运行于Display.asyncExec()方法内。
Job uploadJob = new Job("Job...") {
protected IStatus run(IProgressMonitor monitor) {
// 非UI线程,只能进行非UI的操作
}
}
UIJob dbJob = new UIJob("UIJob...") {
public IStatus runInUIThread(IProgressMonitor monitor){
// UI主线程,可进行UI操作
}
}
当然,需要在Job内进行UI操作,只需要使用Display.asyncExec或Display.syncExec即可。
四:IProgressService的busyCursorWhile与runInUI
IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
progressService.busyCursorWhile(new IRunnableWithProgress(){
public void run(IProgressMonitor monitor) {
// 非UI线程,只能进行非UI的操作
}
});
progressService.runInUI(
PlatformUI.getWorkbench().getProgressService(),
new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
// UI主线程,可进行UI操作
}
},
Platform.getWorkspace().getRoot());
五:Job的状态监听
Job的状态监听,涉及到一个接口IJobChangeListener,或者空实现类JobChangeAdapter。
IJobChangeListener用于对Job的状态进行监听,比如:开始执行,完成,睡眠等状态改变的时候。
六:Job异常处理
异常的处理可以有不同:
1. 将异常直接抛出来:在Job执行过程中,返回带有Exception的Status。
protected IStatus run(IProgressMonitor monitor) {
try {
doJob(monitor); // false
} catch (Exception e) {
return new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
}
return Status.OK_STATUS;
}
};
2. 所有Job完成后进行错误提示:在Job执行过程中,可以将异常保存起来,并借助于IJobChangeListener的done进行job完成后的操作,比如进行异常提示等操作。
job.addJobChangeListener(new JobDoneListener());
class JobDoneListener extends JobChangeAdapter {
@Override
public void done(IJobChangeEvent event) {
if (exception != null) {
exception.printStackTrace();
}