2013-07-02 223 views
1

同样,尝试支持多个回调客户端的服务可能会发现自己缺乏CPU资源,即使所有客户端的表现相对较好。尽管addTextChangedListener支持多个客户端的订阅,但Android库中的许多回调只支持一个。通过这些回调(例如setOn KeyListener),为特定对象上的特定回调设置新客户端将取代以前的任何客户端。先前注册的客户端将不再接收任何回调通知。事实上,它甚至不会被通知它不再是客户。新注册的客户将从此收到所有通知。这是什么意思?

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

但是,我不明白上面的内容。
请eluidate

+0

他们(作者)试图解释'add'和'set'之间的区别是什么...... – Selvin

+0

@Selvin您能否详细说明一下? :-) AFAIK,普通旧Java只有'addXXXListener'而不是'set',所以我有点困惑在这里 –

回答

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)。

+0

因此,这与通常的Java事件处理有很大不同,对吧? Java只允许每个GUI组件有一个侦听器。 –

+0

是的,实质上不同。事实上,这个方法会更好地命名为'addEventListener',因为'set'意味着只有一个。 – Simon

1

我尝试套用:

允许多个监听器的设置可以是一个资源黑洞,你必须通知所有客户端。

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

但是,大多数不这样做,并且您设置的最后一个客户端将会收到通知。

+0

客户端你的意思是用户看到的UI,对吧? :-) –

+1

我猜客户端的意思是“实现一个监听器” - “EditText.setOnKeyListener(listener1); EditText.setOnKeyListener(listener2);''listener2'获取通知 –