【问题标题】:How are the publish() and process() methods on SwingWorker properly used?SwingWorker 上的 publish() 和 process() 方法如何正确使用?
【发布时间】:2013-09-03 07:47:33
【问题描述】:

SwingWorker中的这两个方法目前让我很困惑,而且好像很容易误用。

方法publish()描述如下:

将数据块发送到 process(java.util.List) 方法。此方法用于在 doInBackground 方法内部传递中间结果,以便在 process 方法内部的 Event Dispatch Thread 上进行处理。

这对我来说意味着当我的工作线程正在执行它的doInBackground() 方法时,我能够创建“块”(这些应该是特定的,还是只是一种引用消息对象的方式?),然后将它们发布到我的 Swing GUI 上进行处理。

这将我引向process()。 javadoc 概述了以下内容:

在事件调度线程上从发布方法异步接收数据块。

查看了这两种方法的文档后,任​​何人都可以澄清这是如何发生的背后的机制吗?我知道根据文档,这是一个异步过程,但由于它发生在 EDT 上,我认为它具有一定的可预测性。

publish() 文档指出:

因为进程方法是在事件调度线程上异步调用的,所以在执行进程方法之前可能会多次调用发布方法。出于性能目的,所有这些调用都合并为一个带有串联参数的调用。

总而言之,我的问题有两个:

  • 谁应该打电话给process()
  • process() 在 SwingWorker 和 EDT 的上下文中的工作流程是什么?

如果需要任何澄清,请告诉我。

【问题讨论】:

  • process() 是一个回调。你不需要调用它。 process() 由库在 EDT 中调用。

标签: java swing swingworker


【解决方案1】:

我写了一个程序来处理子树中的目录。处理需要足够长的时间,以至于用户需要一些反馈来表明正在发生的事情。我建立了一个对话框,其中包含一个带有当前正在处理的子目录名称的标签; swingworker 线程调用 publish() 并带有正在处理的每个目录的名称。

无法保证每个目录名称都会更新 UI - 有时处理速度比重新显示要快,尤其是当计算机上发生其他任何事情时,并且取决于运行事物的计算机。因此,可能会调用并执行多次 publish(),而不会被 Swing 运行时调用 process()。

正如已经指出的那样,您的代码不会调用流程 - 在您调用 publish 之后会代表您调用它,并且可能不是每次调用 publish() 时都会调用它。

这对你有好处吗?

【讨论】:

  • 那么 publish 正在有效地做的是将它的块放入某种队列中,然后每次 EDT 调用它时进程都会抓取它..这是看待它的正确方法吗?
  • 是的,并且 Swing 运行时(不是真正的线程)一次对任何累积的块进行处理,如果有多个块的话。
【解决方案2】:

您应该调用 publish() 来添加要由 process() 方法处理的数据。

可以从任何线程调用发布方法。

process 方法在 EDT 线程中执行,因此您可以更改 GUI 内容,只允许在 EDT 线程中执行此操作,因此您不应自己调用 process() 方法。

由你决定你的 process() 必须做什么,但记住它在 EDT 线程中运行,所以它应该很快完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多