2013-01-24 23 views
1

我試圖在我的代碼中使用observable,並且存在這個問題給我帶來困難。對Observable的兩種不同方法調用的觀察者數量不一致

public class observeState extends Observable 
{ 
    public void setSelectedTransaction(int idx) 
    { 
     if (selectedTransaction != idx) 
     { 
      this.selectedTransaction = idx; 
      setChanged(); 
      notifyObservers("setSelectedTransaction"); 
      System.out.println("Observers : "+this.countObservers()); 
     } 
    } 

    public void setLog(Log log) 
    { 
     if(theLog != log) { 
      theLog = log; 
      System.out.println(theLog.getLogTransactions().size() + "setLog"); 
      setChanged(); 
      notifyObservers("setLog"); 
      System.out.println("Observers : "+this.countObservers()); 
     } 
    } 

有兩名觀察員觀察此觀察到的類,它併發出notifyObserverssetSelectedTransaction方法被調用的測試線「觀察員:2」。然而,下一個方法setLog似乎沒有觀察者給出「觀察者:0」。我不認爲我只能使用可觀察的方法。

+0

也許'setChanged()'做了一些奇怪的事情?另外,請仔細檢查「this」是否指向您認爲它指向的內容。 – keyser

+0

謝謝您的意見凱澤:d –

回答

2

這個問題最可能的原因是你沒有在同一個對象上調用方法。假設兩個對象是相同的,因爲它們具有相同的名稱或其他混淆,這是常見的錯誤。我會打印出每個對象的hashCode或者使用一個調試器來確保你確實調用了同一個對象。

順便說一句,你可以嘗試以相反的順序進行呼叫,或一次以上 來測試你的理論。

+1

也存在該觀察員消除自己作爲呼叫觀察員通知的可能性。檢查一下! –

+0

謝謝你們。你說得很對,不知何故,當我打電話給某種方法時,我一直在創建新的對象。感謝您的所有觀點,如果問題的答案與問題標題無關,我該怎麼辦?我應該刪除它嗎? –

+0

觀察者可以在迭代觀察者的同時自行移除而不會引發錯誤。即它不檢查ConcurrentModificationException的 –

0

無論是對象您正在使用調用setSelectedTransactionsetLog不同或觀察員可能是去除自己作爲更新方法觀察員。

+0

謝謝你可能的答案:) –

相關問題