0

我在 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 的子类的实例成员为空。

此外,如果我使用包含匿名内部类的 mConnection 变量并在其上调用 getClass().getName() 或对其调用 toString(),则它显示自己是我的超类的内部类,而不是子类的内部类。

显然我不了解Java继承。我想要一些子类,每个子类都有自己的 mNetwork 变量,由匿名内部类中的方法设置。我不想将匿名内部类的定义切入每个子类。一定有办法的。我究竟做错了什么?

4

1 回答 1

0

有一个办法:

  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());
  }
}
于 2010-07-13T08:50:21.427 回答