在SwingWorker上使用done方法或更改侦听器更好吗?

Pho*_*ixS 5 java user-interface swing swingworker

我有一个任务,当完成它更新一个摇摆GUI告诉已完成.我看到的是你可以使用done()方法或附加a 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();

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

或这个:

public class W extends SwingWorker {

    protected Boolean doInBackground() throws Exception {...}

    protected void done() {
        otherClass.updateTheGuiAndOtherThings();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下没有必要提高效率,我要求更多正确的代码编写.

dic*_*c19 7

在SwingWorker上使用done方法或更改侦听器更好吗?

一般来说,两种方式都是正确和等效的.

但是,使用的主要优点PropertyChangeListener是可以将多个侦听器连接到SwingWorker,这允许您以小代码单元分割任务,而不是只有一个done()代码块.例如,如果您必须更新多个Swing组件并且希望将这些更新紧密地分开,则这非常有用.

此外,使用侦听器可以减少SwingWorker和GUI组件之间的耦合:它不知道后台线程完成后会发生什么,并且没有问题.通过重写done()方法,这将不再是真实的.

一个重要的事情 - 当监听StateValue.DONE或重写done()方法时 - 是调用get()方法以捕获和处理在doInBackground()处理期间可能抛出的任何异常.请参阅与此相关的此问答.

其余的没有重大区别.我只是为了扩展性而与听众一起去.

更新

根据@ mKorbel下面的评论,您可能也想看看这个主题:swingWorker是否保证在完成时抛出状态属性更改事件?甚至recosinder使用SwingWorker.我个人没有遇到任何问题,但了解与此问题的多线程性质相关的可能错误是很好的.

  • 还要提一下,如果正在侦听`SwingWorker.StateValue.DONE`,总是在`done()`或者在你的PropertyChangeListener中调用SwingWorker上的`get()`.这将有助于捕获工作程序运行时可能引发的异常. (3认同)
  • 是和1+.我也喜欢使用侦听器来减少耦合,因为SwingWorker现在必须完全不知道调用代码,而使用`done()`方法则相反. (2认同)