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

发布于 2024-09-09 08:58:50 字数 1292 浏览 2 评论 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 的实例成员为 null。

此外,如果我采用保存匿名内部类的 mConnection 变量并对其调用 getClass().getName() 或对其调用 toString(),它会显示自己是我的超类的内部类,而不是子类的内部类。

显然我不了解java继承的一些东西。我想要有许多子类,每个子类都有自己的 mNetwork 变量,由匿名内部类内部的方法设置。我不想将匿名内部类的定义剪切并传递到每个子类中。一定有办法的。我做错了什么?

I'm doing this in the context of Android, but my problem is understanding Java. I'm somewhat new to both, so hopefully I'm using the correct terminology here.

I've got a number of sub-classes inheriting/extending from my super class (an Android Activity extension) called SuperActivity. I've also defined another class type called Network (which is an Android Service). In my superclass I'm defining an anonymous inner class that implements an (Android) interface called ServiceConnection. That interface specifies (and therefore I'm defining) methods that will be called by the Android system. I have to pass an instance of that anonymous, ServiceConnection-implementing inner class of mine to a method called bindService(), so that the methods inside that anonymous, inner class can be called later.

As I mentioned, I'm subclassing that super-class that defines the anonymous inner class. The methods in that anonymous inner class have to set an instance variable in the subclass instance; that instance variable I need to set is here called mNetwork.

In the superclass:

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

So I create my subclass and call its bindNetwork() method. and apparently the anonymous inner class assigned to mConnection is not an instance member of my subclass, since after the OnServiceConnected() method defined in the anonymous inner class is called, the subclass's instance member called mNetwork is null.

Further, if I take that mConnection variable holding the anonymous inner class and call getClass().getName() on it or toString() on it, it shows itself to be an inner class of my superclass, and not of the subclass.

Obviously I'm not understanding something about java inheritance. I want to have a number of subclasses, each with its own mNetwork variable set by the method inside the anonymous inner class. I don't want to cut and past the definition of the anonymous inner class into each subclass. There's got to be a way. What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不顾 2024-09-16 08:58:50

有一种方法:

  1. 实现一个接口来访问 Network 字段(例如 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());
  }
}

There's a way:

  1. Implement an Interface to access a Network field (like NetworkProvider)
  2. extract the anonymous class to a real class
  3. pass a NetworkProvider to the ServiceConnection implementation

Here's a basic snippet to illustrate the approach:

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());
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文