1

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

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

但是,我不明白上一段中所说的内容。
请说明

4

2 回答 2

1

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

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);
}

第二种方法的问题是您无法控制有多少客户端接收回调,并且注册了很多客户端,它们可能会消耗大量 CPU 来处理回调。

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

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

于 2013-07-02T11:26:59.367 回答
1

我试图解释:

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

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

但是,大多数人不会,您设置的最后一个客户端是会收到通知的客户端。

于 2013-07-02T11:19:52.137 回答