我已经在许多地方看到,规范知识1是调用者的责任,以确保您在更新UI组件时位于UI线程上(特别是在Java Swing中,您位于Event Dispatch Thread上) 。
为什么会这样呢?事件分发线程是MVC / MVP / MVVM中视图的关注点;在视图之外的任何地方处理它,都会在视图的实现和该视图的实现的线程模型之间建立紧密的耦合。
具体来说,假设我有一个使用Swing的MVC架构的应用程序。如果调用者负责更新事件调度线程上的组件,则如果我尝试将Swing View实现换成JavaFX实现,则必须更改所有Presenter / Controller代码以改为使用JavaFX Application线程。
因此,我想我有两个问题:
- 为什么调用者有责任确保UI组件线程安全?我上面的推理中的缺陷在哪里?
- 我该如何设计我的应用程序以松散耦合这些线程安全问题,但仍然是适当的线程安全?
让我添加一些MCVE Java代码来说明“调用者负责”的含义(这里还没有其他好的做法,但我试图将其尽量减少):
来电者负责:
public class Presenter {
private final View;
void updateViewWithNewData(final Data data) {
EventQueue.invokeLater(new Runnable() {
public void run() {
view.setData(data);
}
});
}
}
public class View {
void setData(Data data) {
component.setText(data.getMessage());
}
}
查看负责人:
public class Presenter {
private final View;
void updateViewWithNewData(final Data data) {
view.setData(data);
}
}
public class View {
void setData(Data data) {
EventQueue.invokeLater(new Runnable() {
public void run() {
component.setText(data.getMessage());
}
});
}
}
1:该文章的作者在“ Swing on Stack Overflow”中得分最高。他在所有地方都这么说,而且我也认为这也是其他地方呼叫者的责任。