我有一个任务,当完成它更新一个摇摆GUI告诉已完成。我看到的是您可以使用done()
方法或附加PropertyChangeListener
并听取对done
状态的更改。
有什么好用的?为什么?或者它们是一样的吗?
例如,这个:
public class Foo implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
if ("state".equals(evt.getPropertyName())
&& (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) {
this.updateTheGuiAndOtherThings();
}
}
}
或者这个:
public class W extends SwingWorker {
protected Boolean doInBackground() throws Exception {...}
protected void done() {
otherClass.updateTheGuiAndOtherThings();
}
}
在我的情况下,提高效率并不是必需的,我要求更多正确的代码编写。
答案 0 :(得分:6)
在SwingWorker上使用done方法或更改侦听器会更好吗?
一般来说,两种方式都是正确和等效的。
然而,使用PropertyChangeListener
的主要优点是您可以将多个侦听器连接到SwingWorker,这允许您以小代码单元拆分任务,而不是只有一个done()
代码块。例如,如果您必须更新多个Swing组件并且希望将这些更新保密地分开,这很有用。
此外,使用侦听器可以减少SwingWorker和GUI组件之间的耦合:它不知道后台线程完成后会发生什么,并且没有问题。通过重写done()
方法,这将不再适用。
要做的一件重要事情 - 在监听StateValue.DONE
或覆盖done()
方法时 - 是调用get()
方法来捕获和处理在{期间可能抛出的任何异常{1}}处理。请参阅与此相关的this Q&A。
其余的没有重大区别。我只是为了扩展性而与听众一起去。
根据@ mKorbel下面的评论,您可能也想看看这个主题:Is a swingWorker guaranteed to throw a state property change event on completion?甚至recosinder使用SwingWorker。我个人没有遇到任何问题,但要注意与此问题的多线程性质相关的可能错误是很好的。