Java继承,匿名内部类实例成员,android回调方法

时间:2010-07-13 08:10:43

标签: java inheritance subclass instance-variables

我在Android的上下文中这样做,但我的问题是理解Java。我对两者都有点新意,所以希望我在这里使用正确的术语。

我从我的超级类(Android Activity扩展)继承/扩展了一些名为SuperActivity的子类。我还定义了另一个名为Network的类类型(这是一个Android服务)。在我的超类中,我定义了一个匿名内部类,它实现了一个名为ServiceConnection的(Android)接口。该接口指定(因此我定义)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 :(得分:0)

有一种方法:

  1. 实施接口以访问网络字段(如NetworkProvider
  2. 将匿名类提取到真实类
  3. 将NetworkProvider传递给ServiceConnection实现
  4. 以下是说明该方法的基本代码:

    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());
      }
    }