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<String , Object> 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<ICEventListener> listeners = (LinkedList<ICEventListener>)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<ICEventListener> list = new LinkedList<>();
|
list.add(oldListener);
|
list.add(listener);
|
LISTENER_MAP.put(topic,list);
|
}else if (obj instanceof List){
|
//有多个监听器
|
LinkedList<ICEventListener> listeners = (LinkedList<ICEventListener>)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<ICEventListener> 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<ICEventListener>)((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);
|
}
|
}
|
|
}
|