package com.kitty.poclient.events; import java.util.HashMap; import java.util.concurrent.CopyOnWriteArrayList; import android.util.Log; public class EventDispatcher implements Dispatcher { private static final String TAG = EventDispatcher.class.getSimpleName(); private HashMap<String, CopyOnWriteArrayList<EventListener>> listenerMap; private Dispatcher target; public EventDispatcher() { this(null); } public EventDispatcher(Dispatcher target) { listenerMap = new HashMap<String, CopyOnWriteArrayList<EventListener>>(); this.target = (target != null) ? target : this; } @Override public void addListener(String type, EventListener listener) { synchronized (listenerMap) { CopyOnWriteArrayList<EventListener> list = listenerMap.get(type); if (list == null) { list = new CopyOnWriteArrayList<EventListener>(); listenerMap.put(type, list); } list.add(listener); } } @Override public void removeListener(String type, EventListener listener) { synchronized (listenerMap) { CopyOnWriteArrayList<EventListener> list = listenerMap.get(type); if (list == null) return; list.remove(listener); if (list.size() == 0) { listenerMap.remove(type); } } } @Override public boolean hasListener(String type, EventListener listener) { synchronized (listenerMap) { CopyOnWriteArrayList<EventListener> list = listenerMap.get(type); if (list == null) return false; return list.contains(listener); } } @Override public void dispatchEvent(Event event) { if (event == null) { Log.e(TAG, "can not dispatch null event"); return; } String type = event.getType(); event.setSource(target); CopyOnWriteArrayList<EventListener> list; synchronized (listenerMap) { list = listenerMap.get(type); } if (list == null) return; for (EventListener l : list) { l.onEvent(event); } } public void dispose() { synchronized (listenerMap) { listenerMap.clear(); } target = null; } }