Как я могу настроить несколько прослушивателей для одного события?

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

Может ли кто-нибудь дать мне пример?

Solutions Collecting From Web of "Как я могу настроить несколько прослушивателей для одного события?"

class CompositeListener implements OnEventListener { private List<OnEventListener> registeredListeners = new ArrayList<OnEventListener>(); public void registerListener (OnEventListener listener) { registeredListeners.add(listener); } public void onEvent(Event e) { for(OnEventListener listener:registeredListeners) { listener.onEvent(e); } } } 

…..

 CompositeListener composite = new CompositeListener(); composite.registerListener(listener1); composite.registerListener(listener2); component.setOnEventListener(composite); 

Вы можете попробовать этот хак, вам нужно будет расширить вид, например, расширить кнопку, чтобы принять несколько прослушивателей onclick. Вы создаете внутренний класс, который реализует OnclickListener

 private class OnclickListenerCollection implements OnClickListener{ private ArrayList<OnClickListener> listeners; public void addOnclickListener(OnClickListener listener){ listeners.add(listener); } @Override public void onClick(View v) { for(OnClickListener l : listeners){ l.onClick(v); } } } 

В конструкторе вашей подклассифицированной кнопки вы вызываете super.setOnclickListener, передавая экземпляр вашего внутреннего класса

 private OnclickListenerCollection listenerCollector; 

В вашем конструкторе у вас есть:

 listenerCollector = new OnclickListenerCollection(); super.setOnClickListener(listenerCollector); 

Вы переопределяете метод setOnclickListener, чтобы добавить слушателей в коллекцию

 @Override public void setOnClickListener(OnClickListener l) { listenerCollector.addOnclickListener(l); } 

Я не пробовал, но я считаю, что это сработает

Я знаю, что прошло несколько лет, но мне хотелось добавить мою версию, что я потратил несколько часов на работу. Вот код, расположенный в файле DBupdateEventListener.java:

 public interface DBupdateEventListener { public void onUpdateChannelSubscriptions(); } class DBupdateEventListenerRegistry implements DBupdateEventListener{ public static List<DBupdateEventListener> registeredListeners = new ArrayList<DBupdateEventListener>(); public void registerListener(DBupdateEventListener listener){ registeredListeners.add(listener); } public void onUpdateChannelSubscriptions(){ for (DBupdateEventListener listener:registeredListeners){ listener.onUpdateChannelSubscriptions(); } } } 

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

И вот код, который я использую в методе OnCreate () для фрагмента, который необходимо обновить после запуска события:

  dbUpdater = new DBupdateEventListener() { @Override public void onUpdateChannelSubscriptions() { //put the code you want to run when the event is triggered here: loadChannelListsFromDB(); } }; DBupdateEventListenerRegistry temp = new DBupdateEventListenerRegistry(); temp.registerListener(dbUpdater); 

И вот код, используемый в моей асинхронной задаче, которая запускает событие в первую очередь:

 dbUpdaterRegistry = new DBupdateEventListenerRegistry(); dbUpdaterRegistry.onUpdateChannelSubscriptions();