如何正确使用SwingWorker上的publish()和process()方法?

时间:2013-08-30 14:26:35

标签: java swing swingworker

SwingWorker中的这两种方法目前让我感到困惑,而且似乎很容易错误地使用它们。

方法publish()描述了以下内容:

  

将数据块发送到进程(java.util.List)方法。此方法将在doInBackground方法内部使用,以提供中间结果,以便在流程方法内的事件调度线程上进行处理。

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

这导致我process()。 javadoc概述了以下内容:

  

在Event Dispatch Thread上异步接收来自publish方法的数据块。

在查看了这两种方法的文档后,是否有人可以澄清这种方法背后的机制是什么?据我所知,这是一个异步过程,但由于它是在EDT上进行的,我想象中有一些可预测性。

publish()文档说明了这一点:

  

因为在Event Dispatch Thread上异步调用了process方法,所以在执行process方法之前可能会对publish方法进行多次调用。出于性能目的,所有这些调用都合并为一个带有连接参数的调用。

总结一下,我的问题有两个:

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

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

2 个答案:

答案 0 :(得分:4)

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

无法保证为每个目录名更新UI - 有时处理速度比重新显示更快,特别是如果计算机上发生了其他任何事情,并且取决于运行的计算机。因此,可以调用publish()并执行多次,而不会由Swing运行时调用process()。

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

这能为你解决问题吗?

答案 1 :(得分:3)

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

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

过程方法在EDT线程中执行,因此您可以在EDT线程内更改仅允许这样做的GUI内容,因此您不应该自己调用process()方法。

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