【问题标题】:Switch to Event Dispatch Thread in View or in Presenter?在 View 或 Presenter 中切换到事件调度线程?
【发布时间】:2013-08-02 23:40:38
【问题描述】:

我正在编写一个 MVP 风格的 Java Swing 应用程序。该模型适用于与此问题无关的不同线程中的各种计算。当这些更新发生时,我调用EventQueue.invokeLater 来更新GUI。这些线程切换调用应该发生在 Presenter 中还是 View 中?

Presenter 的参数:

  • 视图应该尽可能的愚蠢
  • 如果视图这样做了,理论上视图可以从 EDT 调用 EventQueue.invokeLater,这是浪费工作

视图参数:

  • 无需注入依赖项 Executor 来对 Presenter 进行单元测试
  • 视图负责呈现自身,确保在 EDT 上发生更新是该职责的一部分

我不确定。最佳做法是什么?

【问题讨论】:

  • 仅将 invokeLater 用于 Swing 方法,在 Swing API 中实现的真正方法(例如 setText,而不是包含 setText 的整个代码块......),不管它们放在哪里(你的代码),这是您设计的一部分,如果代码可读、良好且结构合理,与 EDT 无关
  • @mKorbel 等一下,从您的回复来看,这听起来像是“只在 EDT 上放置实际的 Swing 调用”,这意味着这个卸载应该清楚地在 View 代码中。 (相对于“没关系”)

标签: java swing mvp event-dispatch-thread


【解决方案1】:

我对 MVP 的理解是,您希望 Presenter 通过单独的界面与您的 View 对话。请参阅this question 以获得良好的高级解释。该接口是您调用 invokeLater 的地方。这将使单元测试更容易编写。

另外,仅供参考,您可以随时致电EventQueue.isDispatchThread() 进行检查,然后再调用invokeLater 或invokeAndWait。 InvokeLater 从 EDT 调用它不会有任何损害,但 invokeAndWait 会抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2011-11-11
    • 2011-02-02
    相关资源
    最近更新 更多