为类而不是实例实现一个侦听器

ilo*_*mbo 5 events android listener android-broadcast

我有很多类的实例MyClass,它们全部都从另一个类的一些生成的事件作出反应MyEventClass.我该怎么做?

我的第一个想法是定义一个监听器MyEventClass并在其中实现它MyClass,但这需要每个实例MyClass设置监听器,并且除了将监听器定义为数组之外MyEventClass.
很多代码/工作.

我认为另一种选择是使用广播MyEventClass和接收器MyClass,但我不确定,可能是过度使用,接收器也要注册(并且未注册onStop())

第三种选择是为类定义监听器实现MyClass,而不是为每个实例定义,这将完全适合,但我不知道它是否可行,我该如何编写它.

然而,我刚刚提出的第四个选项是在父类上实现监听器,MyClass并且只设置此监听器MyEventClass,然后在事件发生循环中通过所有MyClass实例并手动调用其监听器.这节省了我注册每个实例MyEventClass.

sor*_*ist 0

StinePike 在这一点上是正确的,这是编码时遇到的一个非常标准的问题。观察者(或 Java 中的监听器)模式是对此问题的标准实践解决方案。你应该使用你的第一个建议,你的措辞有点不清楚,所以我会为你列出它,以防我不太清楚。

让我们MyEventClass提供一个侦听器接口,例如MyEventClassListener和添加/删除方法。然后MyClass可以将自己附加/分离为侦听器。这是一个代码示例,以防您需要:

MyEventClass.java

public class MyEventClass {

    private Set<MyEventClassListener> listeners = new HashSet<MyEventClassListener>();

    // Your code here...

    public void addListener(MyEventClassListener listener) {
        listeners.add(listener);
    }

    public void removeListener(MyEventClassListener listener) {
        listeners.remove(listener);
    }

    public void notifyListeners() {
        for (MyEventClassListener listener : listeners) {
            listener.somethingHappened();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

MyEventClassListener.java

public interface MyEventClassListener {

    public void somethingHappened();

}
Run Code Online (Sandbox Code Playgroud)

MyClass.java

public class MyClass implements MyEventClassListener {

    MyEventClass myEventClass;

    // Your code here..

    public void someFunction() {
        // Add as listener
        myEventClass.addListener(this);
    }

    @Override
    public void somethingHappened() {
        // Act on callback
    }

}
Run Code Online (Sandbox Code Playgroud)