2011-11-23 57 views
0

好吧,所以我之前使用過觀察者,我也遵循完全一樣的方法,但由於某種原因,我的觀察者中的更新方法根本沒有被調用。在Java中可觀察不能正常工作?

在我的Android應用程序活動:

public void newGame(View view) 
{ 
    poleLeft.clear(); 
} 

在我極類:

public void clear() 
{ 
    stack.clear(); 
    size = 0; 
    head = 0; 

    setChanged(); 
    notifyObservers(); 
} 

在我看來類:

private class PoleObserver implements Observer 
{ 
    public void update(Observable observable, Object data) 
    { 
     postInvalidate(); 
    } 
} 

和:

leftPole.addObserver(new PoleObserver()); 

基本上,我想要做的就是在極點(poleLeft)上有一定數量的項目,將其清除,然後讓應用程序視圖重繪以反映這些更改。但是,當我單擊按鈕時,極點被清除,但視圖不會改變,並且在更新方法中放置System.out.println將永遠不會被輸出,因此它永遠不會被運行。爲什麼會這樣?

+0

也許發佈你的addObserver和notifyObservers實現呢? – kabuko

+0

我正在使用內置的Java實現。 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.html – Kyle

+0

等一下,你確定它沒有運行? System.out.println在Android中並不常用。嘗試在那裏設置斷點或使用Log.d(「Pole」,「Observer updated」);並查看LogCat。 – kabuko

回答

0

你是否在執行某些操作?這個例子對我來說很好。

import java.util.Observable; 
import java.util.Observer; 

public class Pole extends Observable { 

    public void clear() 
    { 
     setChanged(); 
     notifyObservers(); 
    } 

    public static class PoleObserver implements Observer 
    { 
     public void update(Observable observable, Object data) 
     { 
      System.out.println("Updated"); 
     } 
    } 

    public static void main(String[] args) { 

     Pole p = new Pole(); 
     p.addObserver(new Pole.PoleObserver()); 
     p.clear(); 

    } 

} 
+0

但是我到底會亂叫什麼?我以前使用過這種精確的技術,它應該完美地工作......我知道你沒有太多的工作可以幫助,但這非常令人沮喪。 – Kyle

+0

嘗試在代碼中放置一個斷點,並逐行逐行或在「postInvalidate」上放置一個斷點並查看它是否被命中。 – icirellik

+0

我嘗試過使用中斷點,並且它從來沒有命中。那是我的問題,我完全不知道爲什麼它從未被擊中。 – Kyle

0

你似乎沒有張貼「真正的」代碼在你使用poleLeft遊戲構造,並在視圖類leftPole。沒有一個小的,可運行的例子,我們可以提供很多幫助。

(或者,也許這種差異是問題的根源!)

幾點建議:

  • 使用@override,確保update方法真的是貫徹落實interface因爲你認爲它是。也許你正在導入另一個Observer,它與你認爲的不同。

  • 使用Log要求,以確保你真的在你以爲你是同一個觀察的安裝觀察員。您可以通過將對象'identityHashCode打印到日誌中來做到這一點。