2014-09-01 22 views
1

我有一個AtomicInteger變量(CurrentCycle)正在一個單獨的線程中更新到我的UI線程中。我試圖根據AtomicInteger的值更新UI字段中的文本字段,而不在UI線程中使用ugle while循環。如何爲在不同線程中運行的變量實現一個變量變量監聽器(示例)

我已經花了幾天在網上搜索查看相關查詢,但沒有得到任何關於此的任何地方。我正在尋找最簡單的方法來做到這一點。我知道有類似問題的帖子,但是由於它們太抽象或者需要不同,所以我一直無法使用它們。

我的主要問題是: 1.我需要註冊一個偵聽器來做到這一點,或者有一個更簡單的方法嗎? 2.我在哪裏以及如何註冊聽衆?我是否必須設置一個單獨的接口類(如果可能,我想避免這種情況)。 3.你能否請一些我可以使用的真實例子 - 抽象的解釋對我來說目前還沒有幫助!

下面我已經包含了我的關鍵代碼(它沒有做任何事情,因爲方法沒有被解僱)。 Anyhelp你可以提供將不勝感激。


// MyActivity.java 
    // Declaration (do I need this?) 
     AtomicInteger CurrentCycle = new AtomicInteger(0);' 


// Method which doesn't appear to be firing when CurrentCycle Changes... 
    public void setVariableChangeListener(VariableChangeListener variableChangeListener) { 
     this.variableChangeListener = variableChangeListener; 

     if ((CurrentCycle != PreviousCycle) && (this.variableChangeListener !=null)) { 
      Toast.makeText(getApplicationContext(), "Test - code on variable change is firing.", Toast.LENGTH_SHORT).show(); 
      PreviousCycle=CurrentCycle; 
    } 

回答

1

我自己,我只是把我的類的PropertyChangeSupport場,給它一個addPropertyChangeListener(...)removePropertyChangeListener(...)方法,只允許原子變量在setXxx(...)方法來改變,並且在同樣的方法,發起財產變更事件。我會注意在GUI的事件線程上調用fire事件。請注意,如果您的GUI是Swing GUI,那麼如果您使用SwingPropertyChangeSupport,線程問題將爲您處理。

例如,從我的回答類似的問題here

public class ServerManager implements Runnable { 
    public static final String IS_RUNNING = "is running"; // for the Event's name 

    // if not a Swing app, then use a PropertyChangeSupport field 
    private SwingPropertyChangeSupport propChngSupport = new SwingPropertyChangeSupport(this); 
    private volatile boolean isRunning = false; 
    // other variables 

    // addPropertyChangeListener(...) {...} goes here 
    // removePropertyChangeListener(...) {...} goes here 

    public void setIsRunning(boolean isRunning) { 
    boolean newValue = isRunning; 
    boolean oldValue = this.isRunning; 
    this.isRunning = isRunning; 
    propChngSupport.firePropertyChange(IS_RUNNING, oldValue, newValue);  
    } 

    public void run() { 
    // .... 
    } 

    // other methods 
} 

至於你具體的問題:

  • 我需要註冊一個監聽器來做到這一點還是有更簡單的方法?

我注意到聽衆沒有看到任何困難。

  • 我在哪裏以及如何註冊聽衆?

觀察者將通過調用一些addListenerXxx(...)類型的方法所觀察到的註冊。

  • 我一定要建立一個獨立的接口類(我想如果可能避免這種情況)。

如果你不使用的PropertyChangeListener或Java的觀察者/可觀察類/接口組合

  • 請你一些真實的例子我可以使用 - 抽象的解釋沒有幫助我這麼遠!

您需要詢問比這個更具體的問題。

+0

感謝您回答這個問題。如果我想在變量變化引發的事情上有更多靈活性,該怎麼辦?即我想能夠在GUI線程中調用一個方法? – 2014-09-02 22:05:12

+0

@OmahaNebrasca:如果你的不是一個Swing應用程序,那麼只需使用一個PropertyChangeSupport實例而不是SwingPropertyChangeSupport,如果你仔細考慮了線程,這個代碼就可以工作。 – 2014-09-02 22:06:34

+0

基本上 - 在一個可運行線程中,我有一個循環通過定時循環播放不同的聲音 - 我希望能夠在播放聲音發生變化時顯示圖形,可能是計時器和一些文本。 – 2014-09-02 22:09:06

相關問題