java中的监听器如何工作

时间:2011-11-14 16:46:01

标签: java android

我想知道是否可以为侦听器创建侦听器。例如,如果我有一个按钮的监听器,我可以创建一个监听器的监听器,这样一旦按下按钮,将通知按钮监听器的监听器。

我的另一个问题是,如果我有一个函数调用,里面有一些监听器,这些监听器会在函数调用返回时被销毁。例如,我可以在程序的开头调用一个函数,该函数具有从我的主程序中监听器的监听器吗?

3 个答案:

答案 0 :(得分:2)

听众只是宣传事件的一种方式。通常,通知侦听器的对象具有一个包含侦听器列表的集合。当有事件发生时,它就会通知并通知列表中的每个听众。

您可以创建侦听器的侦听器。它只是链接。因此,您的监听器将具有将通知的侦听器列表。

侦听器通常驻留在对象中,而不是函数调用。因此,您通常会创建一种在通知侦听器的对象中添加/删除侦听器的方法。

答案 1 :(得分:2)

当然可以。听众或“观察者模式”非常简单。所有观察者模式真正做的是使用接口创建一个“契约”,让每个人都知道某个类实现某个方法,这样你就可以确信你可以在该对象上调用它。

例如,您可以创建两个这样的接口:

public interface OnClickListener {
   public void onClick();
}

public interface SomeOtherListener {
   public void onFoo();
}

希望“触发”这些方法的代码必须引用这些侦听器。通常,这是通过将一些公共方法暴露给“设置监听器”来完成的。所以在某些类中,你有public void setOnClickListener() { this.onClickListener = listener; }实现监听器的类现在可以调用setListener(this)。请注意,“this”在这里工作,因为Java中的接口可以获得那种多态性。您可以将类强制转换为它实现的任何超类或接口。因此,在想要调用“onClick”的类中,所有它关心的是包含“onClick”的类是“onClickListener”。这就是课堂上所关心的。现在,只要实现“onClick”的类具有对SomeOtherListener的引用(通过以前的注册),onClick就可以调用someOtherListener.onFoo();

因此,简而言之,(虽然在某些情况下它可能是一个糟糕的设计)你可以在技术上拥有任意数量的相互关联的监听器,只要你设置它,以便相关的对象/类具有对那些监听器的引用,他们需要。

很抱歉,如果这有点令人困惑。此外,如果没有更多有关您想做什么的详细信息,很难提供更详细的解释。

修改

据我所知,不可能设置一些“catchall”来记录Android应用中的每个GUI事件。由于接口方法被声明为必须实现的空方法,因此您必须在实现中指定您希望并从那里开始的精确日志记录。例如,每次调用setOnClickListener时,你都可以通过攻击Android源来记录一些东西,但是我无法想象它是非常有用的。此外,隐含的是您需要为可用的每种类型的侦听器执行此操作。只有您实现的侦听器才可用于任何类型的日志记录。例如,如果你没有实现onTouch,那么就没有为它显示的日志......

答案 2 :(得分:1)

您可以开始阅读有关接口+策略(策略)和桥接设计模式的内容。通常情况下,java中的侦听器实现为一种策略,区别在于您有许多接口而不是单个接口。

public class MyClass{
 public List<IListener> _listeners;
 public boolean registerListener( IListener listener ){..}
 public boolean removeListener( IListener listener ){...}
 public void doSomething(){
   if( something){
      //foreach listener do listener.doSomthing();
   }
 }
}

因此,IListener是一个接口,您可以实现此接口并在MyClass中注册您的实现。