eclipsercp:从后台作业更新mvc模型

vmpqdwk3  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(212)

我有一个eclipsercp应用程序,它的viewpart基于mvc范式。
mvc视图(复合视图)将自己注册为mvc模型的侦听器,并在模型更改时更新其小部件。
我还有一个后台作业(使用eclipse作业框架),它从服务器获取一些数据,然后更新模型。在我的简单实现中,这会导致swtexception“invalid thread access”,因为在更新模型之后,视图中的侦听器现在从非ui线程调用。
解决这个问题的建议方法是什么?

当前方式:

当前作业代码如下所示(在 viewModel.setData(data) 电话):

  1. public class MyJob extends Job {
  2. private MyViewModel viewModel;
  3. public MyJob(MyViewModel viewModel) {
  4. super("MyJob");
  5. this.viewModel = viewModel;
  6. }
  7. protected IStatus run(IProgressMonitor monitor) {
  8. MyData data = fetchDataFromServer();
  9. viewModel.setData(data);
  10. return Status.OK_STATUS;
  11. }
  12. }

可能的解决方案:

通过从作业更新模型 asyncExec() . 在我的myjob#run方法中:

  1. MyData data = fetchDataFromServer();
  2. Display.getDefault().asyncExec(new Runnable() {
  3. public void run() {
  4. viewModel.setData(data);
  5. }
  6. });
  7. return Status.OK_STATUS;

这似乎有点奇怪,因为模型本身不应该与ui有任何关系,因此通过ui线程机制调用它感觉是错误的。
使用 asyncExec() 在视图的侦听器中:

  1. public void update(Observable arg0, Object arg1) {
  2. Display.getDefault().asyncExec(new Runnable() {
  3. public void run() {
  4. reloadWidgets();
  5. }
  6. });
  7. }

这看起来也很奇怪,因为视图是ui不可或缺的一部分,因此不必以这种“迂回”的方式更新其小部件。
有没有更好的办法解决这个问题?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题