2013-08-18 86 views
1

我正在開發Java Swing程序。如果我使用以下方法,性能可能會有所下降嗎?SwingWorker性能

jButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    SwingWorker worker = new SwingWorker() { 
     protected Object doInBackground() throws Exception { 
     return null; 
     } 

     protected void done() { 
     // do stuff 
     } 
    }; 
    worker.execute(); 
    } 
}); 

如果我做內done()一些沉重的處理任務,是它更好地定義SwingWorker實例作爲一個全球性的成員,而不是一個本地匿名類的聲明?

我認爲如果它是本地的,它會在每次調用actionPerformed時創建(是它?)。使用全局實例會提高性能嗎?全球/本地方法在內存利用率方面有何差異?

+2

爲什麼做過做繁重的處理()?該方法在EDT上運行。如果你這樣做,你可以完全跳過SwingWorker。重處理應該在doInBackground()中完成... – sbrattla

+2

'Global'是什麼意思?在Java中,沒有這樣的術語,或者它與一個「實例(類塊)」相關聯,或者它是「本地的(對其定義的塊)」。 'SwingWorker'是'Thread'的一個專用版本,它用於'GUI'相關的更新,這裏程序員在'doInBackground()'(它發生在EDT之外)執行耗時的任務,並且如果需要的話發送中間信息通過調用'publish(...)(在EDT上執行)'調用'process(...)'方法。 –

回答

4

在你的具體例子中,它很容易回答。甲SwingWorker被設計成只運行一次,如在類Javadoc指定(也見this SO question

的SwingWorker僅設計用於執行一次。多次執行SwingWorker不會導致調用doInBackground方法兩次。

因此,在這種情況下,每次調用actionPerformed時都必須創建一個新實例。

側面說明:沉重的處理工作應在doInBackground方法來完成,而不是在done方法,否則您將阻止EDT

+0

明白了。謝謝澄清! –

+0

一個側面的問題,所以假設我的任務是關閉一些數據(也被其他UI元素訪問),然後更新一個特定的UI元素,那麼該方法應該是:在doInBackground()中進行處理並更新'done()'中的UI? –

+1

@ManindraMoharana正確 – Robin