2013-07-02 4 views
1

К тому же сервис, который пытается поддерживать несколько клиентов обратного вызова, может оказаться голодным для ресурсов ЦП, даже если все клиенты относительно хорошо себя ведут. В то время как 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); 
} 

Проблема второго подхода является то, что вы не можете контролировать, сколько клиенты получают обратные вызовы и с большим количеством клиентов, зарегистрированных, они могут потреблять много обработки процессора обратные вызовы.

Вы можете искусственно ограничить количество слушателей (if(listeners.count() < 5)), но это не имеет смысла с точки зрения ООП.

Какой из них правильный, зависит от вашего дизайна. Обычно я использую последний шаблон, так как знаю, сколько будет клиентов, а число мало (обычно меньше 5).

+0

Так что это существенно отличается от обычной обработки событий Java, правильно? Java допускает только один прослушиватель для компонента GUI. –

+0

Да, существенно отличается.Фактически, метод будет лучше назван 'addEventListener', поскольку' set' подразумевает только один. – Simon

1

Моя попытка перефразировать:

Позволяющего установку нескольких слушателей может быть боров ресурса, как вы должны уведомить всех клиентов.

Некоторые пользователи Android (например, addTextChangeListener) устанавливаются для нескольких клиентов.

Однако большинство из них этого не делают, и последний клиент, который вы установили, является тем, который получит уведомления.

+0

По клиенту вы имеете в виду пользовательский интерфейс, который видит пользователь, не так ли? :-) –

+1

Я предполагаю, что клиентом я подразумеваю «реализацию слушателя» - 'EditText.setOnKeyListener (listener1); EditText.setOnKeyListener (listener2); '' listener2' получает уведомления –