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

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

我有一个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不可或缺的一部分,因此不必以这种“迂回”的方式更新其小部件。
有没有更好的办法解决这个问题?

暂无答案!

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

相关问题