From 2268d28bb43c2b3d7b4dfd96d35c0a844390c5bd Mon Sep 17 00:00:00 2001
From: endian11 <Dana_Lee1016@126.com>
Date: 星期四, 02 一月 2020 14:56:09 +0800
Subject: [PATCH] 完成时间分发库的编写,测试正常

---
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java   |   25 +++++
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java      |   30 +++++
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java    |  202 ++++++++++++++++++++++++++++++++++++++++
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java |   23 ++++
 4 files changed, 276 insertions(+), 4 deletions(-)

diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java
new file mode 100644
index 0000000..f87b93c
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java
@@ -0,0 +1,202 @@
+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){
+                    //杩樻病鏈夌洃鍚櫒锛岀洿鎺ユ斁鍒癕ap闆嗗悎
+                    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);
+        }
+    }
+
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java
new file mode 100644
index 0000000..ce514ea
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java
@@ -0,0 +1,25 @@
+package safeluck.drive.evaluation.cEventCenter;
+
+/**
+ * 浜嬩欢瀵硅薄姹�
+ * MyApplication2
+ * Created by lzw on 2020/1/2. 13:58:00
+ * 閭锛�632393724@qq.com
+ * All Rights Saved! Chongqing AnYun Tech co. LTD
+ */
+public class CEventObjPool extends ObjectPool<CEvent>{
+
+    public CEventObjPool(int capacity) {
+        super(capacity);
+    }
+
+    @Override
+    protected CEvent[] createObjPool(int capacity) {
+        return new CEvent[capacity];
+    }
+
+    @Override
+    protected CEvent createNewObj() {
+        return new CEvent();
+    }
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java
new file mode 100644
index 0000000..e24ab31
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java
@@ -0,0 +1,23 @@
+package safeluck.drive.evaluation.cEventCenter;
+
+/**
+ * 浜嬩欢鐩戝惉鍣�
+ * MyApplication2
+ * Created by lzw on 2020/1/2. 14:00:14
+ * 閭锛�632393724@qq.com
+ * All Rights Saved! Chongqing AnYun Tech co. LTD
+ */
+public interface  ICEventListener {
+
+    /**
+     * 浜嬩欢鍥炶皟鍑芥暟
+     *
+     * 濡傛灉obj浣跨敤浜嗗璞℃睜
+     * 閭d箞浜嬩欢瀹屾垚鍚庯紝obj鍗宠嚜鍔ㄤ細鍙楀埌瀵硅薄姹狅紝璇蜂笉瑕佸啀鍏朵粬绾跨▼缁х画浣跨敤锛屽惁鍒欏彲鑳戒細瀵艰嚧鏁版嵁涓嶆甯�
+     * @param topic
+     * @param msgCode
+     * @param resultCode
+     * @param obj
+     */
+    void onCEvent(String topic, int msgCode, int resultCode, Object obj);
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
index 3eafce0..acaa4e5 100644
--- a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
@@ -8,12 +8,20 @@
  * All Rights Saved! Chongqing AnYun Tech co. LTD
  */
 public abstract class ObjectPool<T extends PooledObject> {
+    /**
+     *  瀵硅薄瀹瑰櫒
+     */
+    private T[] mContainer;
 
-    private T[] mContainer;//瀵硅薄瀹瑰櫒
+    /**
+     *  瀵硅薄閿�
+     */
+    private final Object LOCK = new Object();
 
-    private final Object LOCK = new Object();//瀵硅薄閿�
-
-    private int length;//姣忔杩斿洖瀵硅薄閮芥斁鍒版暟鎹湯绔紝length琛ㄧず鍓嶉潰鍙敤瀵硅薄鏁�
+    /***
+     * 姣忔杩斿洖瀵硅薄閮芥斁鍒版暟鎹湯绔紝length琛ㄧず鍓嶉潰鍙敤瀵硅薄鏁�
+     */
+    private int length;
 
     public ObjectPool(int capacity) {
         mContainer = createObjPool(capacity);
@@ -60,4 +68,18 @@
         }
         return obj;
     }
+
+    /**
+     * 鎶婂璞℃斁鍥炴睜閲岄潰
+     * @param obj
+     */
+    public final void returnObj(T obj){
+        synchronized (LOCK){
+            int size = mContainer.length;
+            if (length < size){
+                mContainer[length] = obj;
+                length++;
+            }
+        }
+    }
 }

--
Gitblit v1.8.0