Android 这是什么意思?

Android 这是什么意思?,android,callback,Android,Callback,出于同样的原因,尝试支持多个回调客户机的服务可能会发现自己缺少CPU资源,即使所有客户机都表现相对良好。addTextChangedListener支持订阅多个客户端,而Android库中的许多回调只支持一个客户端。使用这些回调(例如setOn KeyListener),为特定对象上的特定回调设置新客户端将替换以前的任何客户端。以前注册的客户端将不再接收任何回调通知。事实上,它甚至不会被通知它不再是客户。从那时起,新注册的客户机将收到所有通知 我正在从一本书中学习Android编程,它引入了添加

出于同样的原因,尝试支持多个回调客户机的服务可能会发现自己缺少CPU资源,即使所有客户机都表现相对良好。addTextChangedListener支持订阅多个客户端,而Android库中的许多回调只支持一个客户端。使用这些回调(例如setOn KeyListener),为特定对象上的特定回调设置新客户端将替换以前的任何客户端。以前注册的客户端将不再接收任何回调通知。事实上,它甚至不会被通知它不再是客户。从那时起,新注册的客户机将收到所有通知

我正在从一本书中学习Android编程,它引入了添加侦听器的概念。
从我的Java经验中,我知道什么是监听器,他们做什么

但是,我不明白上述段落中所述的内容。

请回避我试图解释的内容:

允许设置多个侦听器可能会占用资源,因为您必须通知所有客户端

一些Android侦听器(如addTextChangeListener)支持为多个客户端设置


但是,大多数情况下不会,您设置的最后一个客户端将获得通知。

在事件上设置回调侦听器时,通常有两种方法:

private MyEventListener listener;

...

public void setEventListener(MyEventListener listener){
     this.listener = listener;
}

...

// some event later on
this.listener.callback(interestingData);
在这里,每次从客户机类设置侦听器时,都会替换现有的侦听器。只有最后设置侦听器的客户端才会收到回调

另一种方式是这样的:

private ArrayList<MyEventListener> listeners;

...

public void setEventListener(MyEventListener listener){

     if (listeners == null){
        listeners = new ArrayList<MyEventListener>();
     }

     if(!listeners.contains(listener){
        listeners.add(listener);
     }

}

...

// some event later on
for(MyEventListener listener:listeners){
    listener.callback(interestingData);
}
私有ArrayList侦听器;
...
公共void setEventListener(MyEventListener侦听器){
if(侦听器==null){
侦听器=新的ArrayList();
}
如果(!listeners.contains)(侦听器){
添加(侦听器);
}
}
...
//后来发生了什么事
for(MyEventListener侦听器:侦听器){
回调(有趣的数据);
}
第二种方法的问题是,您无法控制有多少客户机接收回调,如果注册了很多客户机,它们可能会消耗大量CPU来处理回调

您可以人为地限制侦听器的数量(
if(listeners.count()<5)
),但从OOP的角度来看,这没有意义


哪一个是正确的取决于你的设计。我通常使用后一种模式,因为我知道会有多少客户,而且数量很少(通常少于5个)。

他们(作者)试图解释
add
set
。@Selvin你能详细说明一下吗?:-)好的,普通的旧Java只有
addXXXListener
而没有
set
,所以我在这里有点困惑,我猜客户端指的是“监听器的实现”-
EditText.setOnKeyListener(监听器1);setOnKeyListener(listener2)
listener2
获取通知这与通常的Java事件处理有很大不同,对吗?Java只允许每个GUI组件有一个侦听器。是的,本质上是不同的。事实上,该方法最好命名为
addEventListener
,因为
set
只表示一个。