2013-06-12 62 views
0

我不想檢查變量是否在我的主類中的xClass中發生了變化。事情是,我的變量僅在單擊ImageView並且正在運行時發生變化在一個線程中,所以我不想檢查一個while循環(我不知道這是否可能)在我的主類中,當變量被改變時做一些事情。所以這就是我所嘗試的,但是當我運行它只是停下來,什麼也不做。Android/Java:觀察主類中的變量

Thread setBack = new Thread() { 
      public void run() { 
       knight.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Counter++; 
         //also have some code here. 
        } 
       } 
}; 

所以這是我的線程和計數器是值,我想watch.And我使用get方法,返回值。

public boolean getCounter(){ 
      if(Counter>=1){ 
       return true; 
      } 
      return false; 
} 

所以這表示值被改變(Counter是全局變量)。 這就是我在我的主課中所做的。

while (true) { 
    if (xClass.getCounter()) { 
     // do something 
    } 
} 

這是我的程序實際上停止running.And我想不出任何其他方式獲取指標,價值改變。

任何幫助表示讚賞,謝謝。

+1

除了上面提到的所有內容之外,請確保將變量聲明爲volatile。您的整體方法聽起來有問題 - 一旦條件滿足,後臺線程可能會在ui線程上運行某些內容,這樣可以避免阻塞ui線程。 –

回答

2

這聽起來像是observer pattern的不錯選擇。你會做什麼這裏是不是通過Counter++而是用一個函數改變變量如

private void incrementCounter() { 
    Counter++; 
    observer.notify(); 
} 

也將添加以下到您的xClass.java

private VariableChangeObserver observer; 

public void register(VariableChangeObserver observer) { 
    this.observer = observer; 
} 

然後你就可以有Main.java實現接口如以下幾點:

public interface VariableChangeObserver { 
    /** 
    * Called whenever the variable is changed. 
    */ 
    public void notify(); 
} 

最後但並非最不重要的,加notify()功能,以您的Main.java當值更新時,它可以做任何你想做的事情。

附加信息: 一般來說,你會有一個觀察者列表,而不是一個。如果你知道在任何時候你只會有一個觀察者,這就足夠了。

0

因爲您的while(true)在主線程中運行並且它阻止了應用程序。

把它放在Thread並啓動它。這樣它不會阻止應用程序,但會做你想做的。

new Thread() { 
    @Override 
    public void run() { 
     while (true) { 
      if (xClass.getCounter()) { 
       //your code 
      } 
     } 
    } 
}.start(); 
+0

其實我已經嘗試過,但我得到異常,我需要使用looper.prepare。這使事情變得更加複雜。我希望的最佳解決方案是,我只有一個bool變量,當我單擊圖像時會發生變化,並以某種方式通知已更改的主類。 – Steven

+0

然後你需要一個觀察者模式。變量發生變化時觸發屬性更改事件,並在需要時將屬性更改偵聽器註冊。 – darijan

0

不是最漂亮的解決方案,但是你可以在xClass中有一個靜態布爾標誌。由於您知道變量的值僅在點擊了imageview後纔會更改,因此可以在修改變量後立即設置flag = true。

knight.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Counter++; 
     mainClassObject.callBackFunction(); 
     //also have some code here. 
    } 
} 

而在Main類中,您將需要定義此回調函數,該函數將處理變量更改。

public static callback(int newValue){ 
    //handle here 
} 

一個無限的while循環應該幾乎不會被用作解決實際問題的方法。喜歡事件驅動的模型。

0

我不完全理解你的代碼的意圖,所以我會盡力回答我的最佳能力。

1)我會建議刷新你的命名約定。以大寫字母開頭的對象名稱通常保留給類名稱,例如查看,活動,CustomClass等 因爲我假設你的計數器是一個變量,我會稱之爲'計數器'而不是'計數器'。

2)在主「線程」(我假設你是意義線程而不是類)中放置循環實際上是好的,如果這是你打算做的事情,但要小心,它會阻止主線程從做其他事情,但執行特定的循環。

3)不要忘記,你必須調用線程上的start()函數來實際運行代碼。

4)在後臺線程中處理UI元素時,請確保在runOnUiThread()內調用UI的任何更改。請參閱how to use runOnUiThread