SwingWorker中的这两种方法目前让我感到困惑,而且似乎很容易错误地使用它们。
方法publish()描述了以下内容:
将数据块发送到进程(java.util.List)方法。此方法将在doInBackground方法内部使用,以提供中间结果,以便在流程方法内的事件调度线程上进行处理。
这对我来说意味着当我的工作线程正在执行其doInBackground()方法时,我能够创建“块”(这些是否应该是特定的或者这只是一种引用消息对象的方式? ),然后发布它们以便在我的Swing GUI上进行处理。
这导致我process()。 javadoc概述了以下内容:
在Event Dispatch Thread上异步接收来自publish方法的数据块。
在查看了这两种方法的文档后,是否有人可以澄清这种方法背后的机制是什么?据我所知,这是一个异步过程,但由于它是在EDT上进行的,我想象中有一些可预测性。
publish()
文档说明了这一点:
因为在Event Dispatch Thread上异步调用了process方法,所以在执行process方法之前可能会对publish方法进行多次调用。出于性能目的,所有这些调用都合并为一个带有连接参数的调用。
总结一下,我的问题有两个:
process()
?process()
的工作流程是什么?如果需要澄清,请告诉我。
答案 0 :(得分:4)
我编写了一个处理子树中目录的程序。处理过程需要足够长的时间,以至于用户需要一些正在进行的反馈。我建立了一个对话框,其中包含一个标签,其中包含当前正在处理的子目录的名称; swingworker线程调用publish(),其中包含正在处理的每个目录的名称。
无法保证为每个目录名更新UI - 有时处理速度比重新显示更快,特别是如果计算机上发生了其他任何事情,并且取决于运行的计算机。因此,可以调用publish()并执行多次,而不会由Swing运行时调用process()。
正如已经指出的那样,您的代码不会调用进程 - 在您调用publish之后代表您调用进程,并且可能不是每次调用publish()时都会调用。
这能为你解决问题吗?
答案 1 :(得分:3)
您应该调用publish()来添加要由process()方法处理的数据。
可以从任何线程调用publish方法。
过程方法在EDT线程中执行,因此您可以在EDT线程内更改仅允许这样做的GUI内容,因此您不应该自己调用process()方法。
由你决定你的进程()必须做什么,但要记住它在EDT线程中运行,所以它应该很快完成。