Проблема с Java-наблюдателем - PullRequest
3 голосов
/ 14 июля 2010

У меня возникли проблемы с реализацией собственного обозревателя в Java на платформе Android.

Я создал вызов класса NetworkPathJni, который использует интерфейсный класс Observer под названием 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 aAvailabilityState).

Внутри этого метода все журналирование возвращается, но метод не вызывается в обозревателе, и я получаю ложь, когда спрашиваю: "SipNetworkPath жив?" в журнале.

Класс наблюдателей теряет ссылку или что-то в этом роде или в моем способе есть ошибка?

1 Ответ

2 голосов
/ 14 июля 2010

В методе 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, а метод в исходном коде не может, тогда должен быть другим кодом в вашем приложении.

Я быдобавьте некоторый код отладки в метод, чтобы четко регистрировать , какие экземпляры фактически вызваны.(Полагаю, последняя скомпилированная версия не была развернута ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...