我有一个eclipsercp应用程序,它的viewpart基于mvc范式。
mvc视图(复合视图)将自己注册为mvc模型的侦听器,并在模型更改时更新其小部件。
我还有一个后台作业(使用eclipse作业框架),它从服务器获取一些数据,然后更新模型。在我的简单实现中,这会导致swtexception“invalid thread access”,因为在更新模型之后,视图中的侦听器现在从非ui线程调用。
解决这个问题的建议方法是什么?
当前方式:
当前作业代码如下所示(在 viewModel.setData(data)
电话):
public class MyJob extends Job {
private MyViewModel viewModel;
public MyJob(MyViewModel viewModel) {
super("MyJob");
this.viewModel = viewModel;
}
protected IStatus run(IProgressMonitor monitor) {
MyData data = fetchDataFromServer();
viewModel.setData(data);
return Status.OK_STATUS;
}
}
可能的解决方案:
通过从作业更新模型 asyncExec()
. 在我的myjob#run方法中:
MyData data = fetchDataFromServer();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
viewModel.setData(data);
}
});
return Status.OK_STATUS;
这似乎有点奇怪,因为模型本身不应该与ui有任何关系,因此通过ui线程机制调用它感觉是错误的。
使用 asyncExec()
在视图的侦听器中:
public void update(Observable arg0, Object arg1) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
reloadWidgets();
}
});
}
这看起来也很奇怪,因为视图是ui不可或缺的一部分,因此不必以这种“迂回”的方式更新其小部件。
有没有更好的办法解决这个问题?
暂无答案!
目前还没有任何答案,快来回答吧!