java中的侦听器是如何工作的

java中的侦听器是如何工作的,java,android,Java,Android,我想知道是否有可能创建一个侦听器。例如,如果我有一个按钮的监听器,我可以为该监听器创建一个监听器,这样一旦按下按钮,按钮监听器的监听器就会收到通知 我的另一个担忧是,如果我有一个函数调用,其中包含一些监听器,那么这些监听器会在函数调用返回时被销毁。例如,我可以在程序开始时调用一个函数,该函数从主程序的侦听器到侦听器?侦听器只是传播事件的一种方式。通常,通知侦听器的对象有一个保存侦听器列表的集合。当有一个事件发生时,它只是去通知列表中的每个侦听器 您可以创建侦听器的侦听器。它只是简单的链接。因此,

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


我的另一个担忧是,如果我有一个函数调用,其中包含一些监听器,那么这些监听器会在函数调用返回时被销毁。例如,我可以在程序开始时调用一个函数,该函数从主程序的侦听器到侦听器?

侦听器只是传播事件的一种方式。通常,通知侦听器的对象有一个保存侦听器列表的集合。当有一个事件发生时,它只是去通知列表中的每个侦听器

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


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

您可以开始阅读有关接口+策略(策略)和桥接器设计模式的内容。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();
   }
 }
}
公共类MyClass{
公共列表(public List)监听者;;
公共布尔寄存器侦听器(IListener侦听器){..}
公共布尔RemovelListener(IListener侦听器){…}
公共无效剂量测定法(){
如果(某物){
//foreach listener do listener.doSomthing();
}
}
}

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

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

例如,您可以创建如下两个接口:

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,那么就没有日志来显示它……

为什么您需要一个侦听器到一个侦听器?当按钮侦听器收到通知时,你就不能调用一个方法吗?现在我通常不会问“为什么这样做”,因为我假设人们有他们的正当理由,但是。。。为什么会这样?为什么不在第一个监听器中执行任何需要的工作,或者在按钮上设置多个监听器,或者在监听器中设置一个“处理程序”列表?基本上,我想做的是向项目中添加一个jar或类,然后在开始时初始化它一次,以最小化应用程序源本身的更改,如果你的问题是特定于android的,那么你应该在上面加上标签。感谢你的回答,基本上我想做的就是记录android应用程序GUI交互的所有事件,同时最小化android源代码中的代码更改。例如,我想在项目中添加一些jar或类,然后在android应用程序中用几行代码初始化它,然后它将记录所有与GUI的事件交互。谢谢基本上,我试图做的是记录android应用程序GUI交互的所有事件,同时最小化android源代码中的代码更改。例如,我想在项目中添加一些jar或类,然后在android应用程序中用几行代码初始化它,然后它将记录所有与GUI的事件交互。我要做的是从GUI中获取所有控件并动态创建侦听器,我会尝试记录从GUI生成的所有事件,如果您有更好的方法,请共享。谢谢!基本上,我试图做的是记录android应用程序GUI交互的所有事件,同时最小化android源代码中的代码更改。例如