对于只想创建一个监听器的人来说,这是一个更通用的答案。我正在总结CodePath的创建自定义监听器。如果您需要更多解释,请阅读该文章。
以下是步骤。
1. 定义一个接口
这是需要与某个未知父级进行通信的子类中的步骤。
public class MyClass {
public interface MyClassListener {
public void onSomeEvent(String title);
}
}
2. 创建一个监听器设置器
在子类中添加一个私有的监听器成员变量和一个公共的设置器方法。
public class MyClass {
private MyClassListener mListener = null;
public void setMyClassListener(MyClassListener listener) {
this.mListener = listener;
}
public interface MyClassListener {
public void onSomeEvent(String title);
}
}
3. 触发监听器事件
现在子对象可以调用监听器接口的方法。请务必检查是否为null,因为可能没有任何人在监听(也就是说,父类可能没有调用我们的监听器的设置方法)。
public class MyClass {
public void someMethod() {
if (mListener != null)
mListener.onSomeEvent("hello");
}
private MyClassListener mListener = null;
public void setMyClassListener(MyClassListener listener) {
this.mListener = listener;
}
public interface MyClassListener {
public void onSomeEvent(String myString);
}
}
4. 在父类中实现监听器回调
现在,父类可以使用我们在子类中设置的监听器。
示例1
public class MyParentClass {
private void someMethod() {
MyClass object = new MyClass();
object.setMyClassListener(new MyClass.MyClassListener() {
@Override
public void onSomeEvent(String myString) {
}
});
}
}
例子 2
public class MyParentClass implements MyClass.MyClassListener {
public MyParentClass() {
MyClass object = new MyClass();
object.setMyClassListener(this);
}
@Override
public void onSomeEvent(String myString) {
}
}
instanceof
,或者其他面向对象的解决方案。我不认为这是一个问题。我理解你的问题是不满意在代码中重复定义监听器接口,这是一种处理方法。而且我并不认为你失去了可读性——我认为将“事件”概念与监听器接口分离,消除了重复定义“监听器”的需要。 - matt blisten(Event)
),而不是以多种方式重新定义listenFoo()
方法。 - matt binterface Listener<T>{ void listen(T event); }
- darkconeja