2010-07-14 67 views
2

我在使用Java平臺在Android平臺上實現自己的觀察器時遇到了一些麻煩。Java觀察器問題

我創建了一個類調用NetworkPathJni,它使用一個名爲NetworkPathJniObserver的Observer接口類來通知其他對象的更改。

這裏是NetworkPathJni.java


public class NetworkPathJni { 

NetworkPathJniObserver networkPathJniObserver; 

    public NetworkPathJni(NetworkPathJniObserver aObserver){ 

    networkPathJniObserver = aObserver; 
    Log.d("Phone", "NetworkPathJni Created"); 

    } 

    public void NetworkPathStateChanged(int aAvailabilityState){ 
     Log.d("Phone", "NetworkPathStateChanged new state = " + aAvailabilityState); 
     TAvailabilityState availabilityState = intToAvailability(aAvailabilityState); 
     Log.d("Phone", "Is SipNetworkPath alive?" + networkPathJniObserver.isAlive()); 
     networkPathJniObserver.NetworkPathStateChanged(availabilityState); 
     Log.d("Phone", "NetworkPathStateChanged end"); 
     Log.d("Phone", "Is SipNetworkPath alive? (2)" + networkPathJniObserver.isAlive()); 

    } 

的代碼,這裏是觀察者


public interface NetworkPathJniObserver { 

void NetworkPathStateChanged(TAvailabilityState aAvailabilityState); 

boolean isAlive(); 
} 

代碼觀察員是在一個名爲SipNetworkPath


類如下實施
public class SipNetworkPath implements NetworkPathInterface, NetworkPathJniObserver{ 

NetworkPathObserverInterface observer; 
NetworkPathJni networkPathJni; 

public SipNetworkPath(NetworkPathObserverInterface aObserver){ 
    domainType = aDomainType; 
    observer = aObserver; 
    networkPathJni = new NetworkPathJni(this); 
    Log.d("Phone", "SipNetworkPath created"); 
} 

//NetworkPathJniObserver 

@Override 
public void NetworkPathStateChanged(TAvailabilityState availabilityState) { 
    Log.d("SipNetworkPath", "SipNetworkPath - Do networkpathstate changed!"); 
} 

@Override 
public boolean isAlive() { 
    return true; 

} 

而且SipNetworkPath如下


public class WifiNetworkPath extends SipNetworkPath{ 

public WifiNetworkPath(NetworkPathObserverInterface aObserver) { 
    super(aObserver); 
} 

的日誌記錄實例化表明,無論NetworkPathJni和SipNetworkPath得到創建,並淨調用workPathStateChanged(int aAvailabilityState)。

在該方法中,所有日誌記錄都會返回,但該方法不會在觀察者中被調用,並且當我詢問「SipNetworkPath是否處於活動狀態?在日誌中。

觀察員類是否失去了參考或某些東西,或者在我這樣做的過程中是否有錯誤?

+0

這是非常多的代碼,你不能提供一個更小的例子嗎?如果我能夠複製和粘貼以編譯這些垃圾代碼,會更容易。我不能看到一個錯誤,但它應該很容易找到我的IDE的幫助。順便說一下,該EVER應該如何返回false:public boolean isAlive(){return true;} – atamanroman 2010-07-14 10:46:09

+0

我不知道我能做到多簡單。在我看來,這不完全是一大塊代碼。這就是我的問題,爲什麼它會返回錯誤?這與丟失引用的對象或垃圾收集器收集的東西有關嗎? – 2010-07-14 10:56:33

+0

如果你問過這樣的話:「爲什麼返回true返回false」,我不必搜索整個代碼中的錯誤 - 如果返回true不會返回true,而是程序邏輯被破壞。如果您曾嘗試提供此問題的簡短示例(http://www.yoda.arachsys.com/csharp/complete.html),則您會發現這可能與您自己的觀察者模式無關。 – atamanroman 2010-07-14 12:10:26

回答

2

在方法NetworkPathStateChanged中,您對可用性狀態無所作爲。 isAlive你會作何反應基於狀態,

private TAvailabilityState availablilityState = null; // or a more suiteable initial value 
@Override 
public void NetworkPathStateChanged(TAvailabilityState availabilityState) { 
    this.availabilityState = availabilityState; 
    Log.d("SipNetworkPath", "SipNetworkPath - Do networkpathstate changed!"); 
} 

然後在方法:一般你會存儲在內部,這樣

@Override 
public boolean isAlive() { 
    return availabilityState == TAvailabilityState.ALIVE; // <-- this is just a guess, I don't know this class or enum. 
} 

在這種情況下(指您的評論)其他NetworkPathJniObserver的實現必須存在某處,否則在類路徑中仍然存在舊的類文件。只是因爲:如果isAlive()方法返回false而源代碼中的那個不能,那麼必須是您的應用程序中的一些其他代碼。

我會爲該方法添加一些調試代碼,以明確記錄哪些實際上被調用。 (我的猜測是,最後編譯的版本還沒有被部署......)

+0

感謝那個Andreas,但那不是問題,問題是NetworkPathStateChanged方法永遠不會在調用時運行。與isAlive方法一樣,它在調用時似乎不會運行,因爲它應該簡單地返回true,但實際上它返回false。 – 2010-07-14 11:25:52

+0

如果這是正確的答案,也許你可以告訴我們什麼是錯的。 – atamanroman 2010-07-14 12:13:52

+0

Observer的兩個實例正在創建,導致第二個實例有空方法覆蓋第一個實例。 – 2010-07-14 15:54:55