2013-06-11 5 views
1

Я предполагаю, что каждый знает интерфейс интерфейса слушателя. У меня есть класс с некоторыми любимыми предметами, которые пользователь может добавить или удалить.Несколько слушателей в одном классе

В этом классе у меня есть:

public static OnFavsChangedListener onFavsChangedListener; 

public interface OnFavsChangedListener { 
    abstract void onFavsChanged(); 
} 

public static void setOnFavsChangedListener(
     OnFavsChangedListener listener) { 
    onFavsChangedListener = listener; 
} 

public void addToFavorites() { 
    if (onFavsChangedListener != null) { 
     onFavsChangedListener.onFavsChanged() 
    } 
} 

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

Моя идея состояла в том, чтобы использовать ArrayList слушателей и назвать их всех, когда мой Favs изменения, но это трудно не позволить ArrayList расти слишком большой (Activities может добавить слушателя при каждом изменении ориентации/onCreate). Я мог бы использовать HashMap идентификаторов и слушателей, пусть каждый Activit убирает его слушателя onDestroy, но это кажется неуклюжим.

TL; DR: Какой изящный способ для нескольких Activities быть информированным, когда меняет Favs?

+0

Что такое управление Favs? IOW, кто будет вызывать 'addToFavorites()' в вашем сценарии? – CommonsWare

+1

Я собирался предложить, что сказал блэмер в своем ответе, использовать автобус, чтобы сгладить это. Если вы не хотите этого делать, типичный шаблон - использовать коллекцию слушателей, и слушатели должны отменить регистрацию, когда это будет сделано (это обычная причина ошибок/утечек, но так оно и работает, и это одна из причин предпочтительной шины - также автобус намного меньше кода). –

+0

@CommonsWare addTofavorites может также вызываться из разных видов деятельности. Это общедоступный статический метод. Однако я позаботился о возможных ConcurrentModificationExceptions. – FWeigl

ответ

3

Это может быть излишним для вашего прецедента, но для уведомления классов о событиях я использую шину событий (в частности, https://github.com/greenrobot/EventBus).

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

+0

Я определенно посмотрю на это, потому что я опубликовал только упрощенную версию, на самом деле у меня есть разные списки «Избранное», «Элементы на заказ» и т. Д., Поэтому это может сэкономить мне некоторую проблему в долгосрочной перспективе. Спасибо за предложение. – FWeigl

+0

Должен поблагодарить вас за это, эта библиотека настолько крута! – FWeigl

+0

Я рад, что вам это нравится, я сам его поклонник. – bclymer

Смежные вопросы