代码之家  ›  专栏  ›  技术社区  ›  Donal Rafferty

Java观察者问题

  •  2
  • Donal Rafferty  · 技术社区  · 14 年前

    我在Android平台上用Java实现自己的observer时遇到了一些问题。

    我创建了一个名为NetworkPathJni的类,它使用一个名为NetworkPathJniObserver的观察者接口类来通知其他对象更改。

    下面是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,并调用了NetworkPathStateChanged(int aaavailabilitystate)。

    在该方法中,所有的日志记录都会返回,但是观察者不会调用该方法,并且当我在日志记录中询问“SipNetworkPath还活着吗?”时,我会得到false。

    观察者类是否丢失了引用或者其他什么,或者在我这样做的方式中是否有错误?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Andreas Dolk    14 年前

    In方法 NetworkPathStateChanged 你没有对可用性状态做任何操作。通常您会将其存储在内部,如下所示:

    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!");
    }
    

    那么,在方法上 isAlive 你会根据国家做出回应:

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

    NetworkPathJniObserver 必须存在于某个地方,否则类路径上仍有旧的类文件。只是因为:如果 isAlive() 方法返回 false 而源代码中的一个不能,那么 必须 在你的应用程序中有一些其他的代码。

    我会添加一些调试代码到方法中,以清楚地记录 哪一个 实例实际上被调用(我的猜测是,最后编译的版本还没有部署……)