Наследование Java, анонимный член экземпляра внутреннего класса, метод обратного вызова Android - PullRequest
0 голосов
/ 13 июля 2010

Я делаю это в контексте Android, но моя проблема в понимании Java.Я несколько новичок в обоих случаях, так что, надеюсь, я использую правильную терминологию здесь.

У меня есть несколько подклассов, унаследованных / расширенных от моего суперкласса (расширение Android Activity) под названием SuperActivity,Я также определил другой тип класса под названием Сеть (который является службой Android).В моем суперклассе я определяю анонимный внутренний класс, который реализует интерфейс (Android) под названием ServiceConnection.Этот интерфейс определяет (и поэтому я определяю) методы, которые будут вызываться системой Android.Я должен передать экземпляр этого анонимного внутреннего класса, реализующего ServiceConnection, методу bindService (), чтобы методы внутри этого анонимного внутреннего класса могли быть вызваны позже.

Как я уже говорил,Я создаю подкласс того суперкласса, который определяет анонимный внутренний класс.Методы в этом анонимном внутреннем классе должны установить переменную экземпляра в экземпляре подкласса;та переменная экземпляра, которую мне нужно установить, здесь называется mNetwork.

В суперклассе:

public class SuperActivity extends Activity {
    protected Network mNetwork;

    protected ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mNetwork = ((Network.NetworkBinder)service).getService();
        }
    }

    void bindNetwork() {
        bindService( new Intent(this, Network.class), mConnection, Context.BIND_AUTO_CREATE);
    }
}

Поэтому я создаю свой подкласс и вызываю его метод bindNetwork ().и, очевидно, анонимный внутренний класс, назначенный mConnection, не является членом экземпляра моего подкласса, поскольку после вызова метода OnServiceConnected (), определенного в анонимном внутреннем классе, экземпляр экземпляра подкласса с именем mNetwork имеет значение null.

Далее, если я возьму эту переменную mConnection, содержащую анонимный внутренний класс, и вызову getClass (). getName () для него или toString () для него, она покажет себя как внутренний класс моего суперкласса, а не подкласса.

Очевидно, я не понимаю что-то о наследовании Java.Я хочу иметь несколько подклассов, каждый со своей переменной mNetwork, установленной методом внутри анонимного внутреннего класса.Я не хочу вырезать и вставить определение анонимного внутреннего класса в каждый подкласс.Должен быть способ.Что я делаю не так?

1 Ответ

0 голосов
/ 13 июля 2010

Есть способ:

  1. Реализация интерфейса для доступа к полю сети (например, NetworkProvider)
  2. извлечение анонимного класса в реальный класс
  3. передать NetworkProvider в реализацию ServiceConnection

Вот базовый фрагмент, иллюстрирующий подход:

public interface NetworkProvider {
  public void setNetwork(Network network);
  public Network getNetwork();
}

public class SuperActivity extends Activity implements NetworkProvider {
  private Network mNetwork;
  @Override public  void setNetwork(Network network){this.mNetwork = network;}
  @Override Network void getNetwork(){return mNetwork;}

  protected ServiceConnection mConnection = new MyServiceConnection(this);

  // more methods
}

public class MyServiceConnection implements ServiceConnection {  // or 'extends' if it's a class
  private NetworkProvider networkProvider;
  public MyService(NetworkProvider networkProvider) {this.networkProvider = networkProvider;}

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
      networkProvider.setNetwork(((Network.NetworkBinder)service).getService());
  }
}
...