package safeluck.drive.evaluation.cEventCenter; import android.text.TextUtils; import android.util.Log; import java.util.HashMap; import java.util.LinkedList; import java.util.List; /** * MyApplication2 * Created by lzw on 2020/1/2. 14:03:04 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class CEventCenter { private static final String TAG = CEventCenter.class.getSimpleName(); /** * 监听器列表,支持一对多存储 */ private static final HashMap LISTENER_MAP = new HashMap<>(); /** * 监听器列表锁 */ private static final Object LISTENER_LOCK = new Object(); /** * 事件对象池 */ private static final CEventObjPool POOL = new CEventObjPool(5); /** * 注册/注销监听器 * @param toBind true注册 false注销 * @param listener 监听器 * @param topic 单个主题 */ public static void onBindEvent(boolean toBind,ICEventListener listener,String topic){ onBindEvent(toBind,listener,new String[]{topic}); } /** * * @param toBind * @param listener * @param topics 多个主题 */ public static void onBindEvent(boolean toBind,ICEventListener listener,String[] topics){ if (toBind){ registerEventListener(listener, topics); }else{ unregisterEventListener(listener, topics); } } /** * 注册监听器 * @param listener * @param topic 单个主题 */ public static void registerEventListener(ICEventListener listener, String topic){ registerEventListener(listener,new String[]{topic}); } /** * 注销监听器 * @param listener * @param topic 单个个主题 */ private static void unregisterEventListener(ICEventListener listener, String topic) { unregisterEventListener(listener,new String[]{topic}); } /** * 注销监听器 * @param listener * @param topics 多个主题 */ private static void unregisterEventListener(ICEventListener listener, String[] topics) { if (null == listener || null == topics){ return; } synchronized (LISTENER_LOCK){ for (String topic : topics) { if (TextUtils.isEmpty(topic)) { continue; } Object obj = LISTENER_MAP.get(topic); if (null == obj){ continue; }else if (obj instanceof ICEventListener){ //有一个监听器 if (obj == listener){ LISTENER_MAP.remove(topic); } }else if (obj instanceof List){ //有多个监听器 LinkedList listeners = (LinkedList)obj; listeners.remove(listener); } } } } /** * 注册监听器 * @param listener * @param topics 多个主题 */ private static void registerEventListener(ICEventListener listener, String[] topics) { if (null == listener || null == topics){ return; } synchronized (LISTENER_LOCK){ for (String topic : topics) { if (TextUtils.isEmpty(topic)){ continue; } Object obj = LISTENER_MAP.get(topic); if (null == obj){ //还没有监听器,直接放到Map集合 LISTENER_MAP.put(topic,listener); }else if (obj instanceof ICEventListener){ //有一个监听器 ICEventListener oldListener = (ICEventListener)obj; if (listener == oldListener){ //去重 continue; } LinkedList list = new LinkedList<>(); list.add(oldListener); list.add(listener); LISTENER_MAP.put(topic,list); }else if (obj instanceof List){ //有多个监听器 LinkedList listeners = (LinkedList)obj; if (listeners.indexOf(listener) >=0){ //去重 continue; } listeners.add(listener); } } } } public static void dispatchEvent(String topic, int msgCode, int resultCode, Object object){ if (!TextUtils.isEmpty(topic)){ CEvent event = POOL.get(); event.setMsgCode(msgCode); event.setTopic(topic); event.setResultCode(resultCode); event.setObj(object); dispatchEvent(event); } } private static void dispatchEvent(CEvent event){ if (LISTENER_MAP.size() == 0){ return; } if (null != event && !TextUtils.isEmpty(event.getTopic())){ String topic = event.getTopic(); //通知事件监听器处理事件 ICEventListener listener = null; LinkedList listeners = null; synchronized (LISTENER_LOCK){ Log.d(TAG, "dispatchEvent | topic="+topic+"\tmsgCode="+event.getMsgCode()+"\tresultCode="+event.getResultCode() +"\tobj="+event.getObj()); Object obj = LISTENER_MAP.get(topic); if (obj == null){ return; } if (obj instanceof ICEventListener){ listener = (ICEventListener)obj; }else if (obj instanceof List){ listeners = (LinkedList)((LinkedList)obj).clone(); } } if (null != listener){ listener.onCEvent(topic,event.getMsgCode(),event.getResultCode(),event.getObj()); }else if (null != listeners && listeners.size()>0){ for (ICEventListener l: listeners) { l.onCEvent(topic, event.getMsgCode(), event.getResultCode(), event.getObj()); } } //把对象放回池里 POOL.returnObj(event); } } }