|  |  | 
 |  |  | 
 | 
 |  |  |     private static final ExecutorService ioThread = ThreadToolUtils.getInstance().newFixedThreadPool(3);
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     private EventDispatcher() {
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | //    private static class SingletonInstance {
 | 
 |  |  |         private static final EventDispatcher instance = new EventDispatcher();
 | 
 |  |  |     //    private static class SingletonInstance {
 | 
 |  |  |     private static final EventDispatcher instance = new EventDispatcher();
 | 
 |  |  | //    }
 | 
 |  |  | 
 | 
 |  |  |     public static EventDispatcher getInstance() {
 | 
 |  |  |         return instance;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     public synchronized void register(Object tag, EventListener listener) {
 | 
 |  |  |         if (!EVENT.containsKey(tag)) {
 | 
 |  |  |             EVENT.put(tag, new ArrayList<>());
 | 
 |  |  |     public void register(Object tag, EventListener listener) {
 | 
 |  |  |         synchronized (this) {
 | 
 |  |  |             try {
 | 
 |  |  |                 LogUtils.i("注册主题:" + tag);
 | 
 |  |  |                 if (tag == null) return;
 | 
 |  |  |                 if (!EVENT.containsKey(tag)) {
 | 
 |  |  |                     EVENT.put(tag, new ArrayList<>());
 | 
 |  |  |                 }
 | 
 |  |  |                 if (listener == null) {
 | 
 |  |  |                     LogUtils.i("监听事件为空");
 | 
 |  |  |                     return;
 | 
 |  |  |                 }
 | 
 |  |  |                 Objects.requireNonNull(EVENT.get(tag)).add(listener);
 | 
 |  |  |                 TYPE.put(listener, MAIN_TYPE);
 | 
 |  |  |             } catch (Exception e) {
 | 
 |  |  |                 LogUtils.e("register:" + e.getMessage());
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |         List<EventListener> events = EVENT.get(tag);
 | 
 |  |  |         if (events != null && !events.contains(listener)) {
 | 
 |  |  |             events.add(listener);
 | 
 |  |  |         }
 | 
 |  |  |         TYPE.put(listener, MAIN_TYPE);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     public synchronized void registerIo(Object tag, EventListener listener) {
 | 
 |  |  |         if (!EVENT.containsKey(tag)) {
 | 
 |  |  |             EVENT.put(tag, new ArrayList<>());
 | 
 |  |  |     public  void registerIo(Object tag, EventListener listener) {
 | 
 |  |  |         synchronized (this) {
 | 
 |  |  |             LogUtils.i("注册主题:" + tag);
 | 
 |  |  |             if (tag == null) return;
 | 
 |  |  |             if (!EVENT.containsKey(tag)) {
 | 
 |  |  |                 EVENT.put(tag, new ArrayList<>());
 | 
 |  |  |             }
 | 
 |  |  |             try {
 | 
 |  |  |                 if (listener == null) {
 | 
 |  |  |                     LogUtils.i("监听事件为空");
 | 
 |  |  |                     return;
 | 
 |  |  |                 }
 | 
 |  |  |                 Objects.requireNonNull(EVENT.get(tag)).add(listener);
 | 
 |  |  |                 TYPE.put(listener, IO_TYPE);
 | 
 |  |  |             } catch (Exception e) {
 | 
 |  |  |                 LogUtils.e("registerIo:" + e.getMessage());
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |         List<EventListener> events = EVENT.get(tag);
 | 
 |  |  |         if (events != null && !events.contains(listener)) {
 | 
 |  |  |             events.add(listener);
 | 
 |  |  |         }
 | 
 |  |  |         TYPE.put(listener, IO_TYPE);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     public synchronized void remove(Object tag) {
 | 
 |  |  |         try {
 | 
 |  |  | 
 | 
 |  |  |             ioThread.execute(new Runnable() {
 | 
 |  |  |                 @Override
 | 
 |  |  |                 public void run() {
 | 
 |  |  |                     try {
 | 
 |  |  |                         if (EVENT.containsKey(tag)) {
 | 
 |  |  |                             List<EventListener> list = EVENT.get(tag);
 | 
 |  |  |                             for (EventListener eventListener : list) {
 | 
 |  |  |                                 TYPE.remove(eventListener);
 | 
 |  |  |                             }
 | 
 |  |  |                             EVENT.remove(tag);
 | 
 |  |  |     public  void remove(Object tag) {
 | 
 |  |  |         synchronized (this) {
 | 
 |  |  |             if (tag == null) {
 | 
 |  |  |                 return;
 | 
 |  |  |             }
 | 
 |  |  |             try {
 | 
 |  |  |                 if (EVENT.containsKey(tag)) {
 | 
 |  |  |                     LogUtils.i("移除key:" + tag);
 | 
 |  |  |                     List<EventListener> list = EVENT.get(tag);
 | 
 |  |  |                     for (EventListener eventListener : list) {
 | 
 |  |  |                         if (eventListener == null) {
 | 
 |  |  |                             continue;
 | 
 |  |  |                         }
 | 
 |  |  |                     } catch (Exception ignored) {
 | 
 |  |  |                         LogUtils.e("移除event异常1:"+ignored.getMessage());
 | 
 |  |  |                         TYPE.remove(eventListener);
 | 
 |  |  |                     }
 | 
 |  |  |                     EVENT.remove(tag);
 | 
 |  |  |                 }
 | 
 |  |  |             } catch (Exception ignored) {
 | 
 |  |  |                 LogUtils.e("移除event异常1:" + ignored.getMessage());
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     public  void remove(Object tag, EventListener listener) {
 | 
 |  |  |         synchronized (this) {
 | 
 |  |  |             try {
 | 
 |  |  |                 if (tag == null || listener == null) {
 | 
 |  |  |                     return;
 | 
 |  |  |                 }
 | 
 |  |  |                 if (EVENT.containsKey(tag)) {
 | 
 |  |  |                     LogUtils.i("移除key:" + tag);
 | 
 |  |  |                     List<EventListener> ev = EVENT.get(tag);
 | 
 |  |  |                     if (ev != null && !ev.isEmpty()) {
 | 
 |  |  |                         TYPE.remove(listener);
 | 
 |  |  |                         ev.remove(listener);
 | 
 |  |  |                     }
 | 
 |  |  |                 }
 | 
 |  |  |             });
 | 
 |  |  |         }catch (Exception e){
 | 
 |  |  |             LogUtils.e("移除event异常2:"+e.getMessage());
 | 
 |  |  |             } catch (Exception ignored) {
 | 
 |  |  |                 LogUtils.e("移除event异常1:" + ignored.getMessage());
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     public synchronized void remove(Object tag, EventListener listener) {
 | 
 |  |  |         try {
 | 
 |  |  |             ioThread.execute(new Runnable() {
 | 
 |  |  |                 @Override
 | 
 |  |  |                 public void run() {
 | 
 |  |  |                     try {
 | 
 |  |  |                         if (EVENT.containsKey(tag)) {
 | 
 |  |  |                             List<EventListener> ev = EVENT.get(tag);
 | 
 |  |  |                             if (ev != null && !ev.isEmpty()) {
 | 
 |  |  |                                 TYPE.remove(listener);
 | 
 |  |  |                                 ev.remove(listener);
 | 
 |  |  |                             }
 | 
 |  |  |                         }
 | 
 |  |  |                     } catch (Exception ignored) {
 | 
 |  |  |                         LogUtils.e("移除event异常1:"+ignored.getMessage());
 | 
 |  |  |                     }
 | 
 |  |  | 
 | 
 |  |  |                 }
 | 
 |  |  |             });
 | 
 |  |  |         }catch (Exception e){
 | 
 |  |  |             LogUtils.e("移除event异常2:"+e.getMessage());
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     public synchronized void post(Object tag, @NonNull Object o) {
 | 
 |  |  |         if (EVENT.containsKey(tag)) {
 | 
 |  |  |             List<EventListener> list = EVENT.get(tag);
 | 
 |  |  |             if (list != null && !list.isEmpty()) {
 | 
 |  |  |                 for (EventListener listener : list) {
 | 
 |  |  |         if (tag == null) {
 | 
 |  |  |             LogUtils.i("post tag为空");
 | 
 |  |  |             return;
 | 
 |  |  |         }
 | 
 |  |  |         try {
 | 
 |  |  |             if (EVENT.containsKey(tag)) {
 | 
 |  |  |                 LogUtils.i("post:" + tag);
 | 
 |  |  |                 List<EventListener> list = EVENT.get(tag);
 | 
 |  |  |                 if (list != null && !list.isEmpty()) {
 | 
 |  |  |                     for (EventListener listener : list) {
 | 
 |  |  |                         if (listener == null) {
 | 
 |  |  |                             continue;
 | 
 |  |  |                         }
 | 
 |  |  |                         ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
 | 
 |  |  |                             @Override
 | 
 |  |  |                             public void run() {
 | 
 |  |  |                                 try {
 | 
 |  |  |                                     if (listener != null) {
 | 
 |  |  |                                         listener.onMessage(o);
 | 
 |  |  |                                     }
 | 
 |  |  |                                 } catch (Exception e) {
 | 
 |  |  |                                     LogUtils.e("post异常1:" + e.getMessage());
 | 
 |  |  |                                 }
 | 
 |  |  |                             }
 | 
 |  |  |                         });
 | 
 |  |  |                     }
 | 
 |  |  |                 }
 | 
 |  |  |             }
 | 
 |  |  |             //所有主题的Listener通知
 | 
 |  |  |             if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
 | 
 |  |  |                 for (EventListener listener : ALL_TOPICS_EVENT) {
 | 
 |  |  |                     if (listener == null) {
 | 
 |  |  |                         continue;
 | 
 |  |  |                     }
 | 
 |  |  |                     ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
 | 
 |  |  |                         @Override
 | 
 |  |  |                         public void run() {
 | 
 |  |  |                             if (listener != null) {
 | 
 |  |  |                                 listener.onMessage(o);
 | 
 |  |  |                             try {
 | 
 |  |  |                                 if (listener != null) {
 | 
 |  |  |                                     listener.onMessage(o);
 | 
 |  |  |                                 }
 | 
 |  |  |                             } catch (Exception e) {
 | 
 |  |  |                             }
 | 
 |  |  |                         }
 | 
 |  |  |                     });
 | 
 |  |  |                 }
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |         //所有主题的Listener通知
 | 
 |  |  |         if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
 | 
 |  |  |             for (EventListener listener : ALL_TOPICS_EVENT) {
 | 
 |  |  |                 ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
 | 
 |  |  |                     @Override
 | 
 |  |  |                     public void run() {
 | 
 |  |  |                         if (listener != null) {
 | 
 |  |  |                             listener.onMessage(o);
 | 
 |  |  |                         }
 | 
 |  |  |                     }
 | 
 |  |  |                 });
 | 
 |  |  |             }
 | 
 |  |  |         }catch (Exception e){
 | 
 |  |  |             LogUtils.e("post异常2:" + e.getMessage());
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |      * @param listener
 | 
 |  |  |      */
 | 
 |  |  |     public synchronized void registerAllTopicsListener(EventListener listener) {
 | 
 |  |  |         if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.contains(listener)) {
 | 
 |  |  |             ALL_TOPICS_EVENT.add(listener);
 | 
 |  |  |         if(listener==null){
 | 
 |  |  |             return;
 | 
 |  |  |         }
 | 
 |  |  |         TYPE.put(listener, MAIN_TYPE);
 | 
 |  |  |         try {
 | 
 |  |  |             if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.contains(listener)) {
 | 
 |  |  |                 ALL_TOPICS_EVENT.add(listener);
 | 
 |  |  |             }
 | 
 |  |  |             TYPE.put(listener, MAIN_TYPE);
 | 
 |  |  |         }catch (Exception e){
 | 
 |  |  |             LogUtils.e("registerAllTopicsListener:" + e.getMessage());
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  | 
 |  |  |                 @Override
 | 
 |  |  |                 public void run() {
 | 
 |  |  |                     try {
 | 
 |  |  |                         if(listener==null){
 | 
 |  |  |                             return;
 | 
 |  |  |                         }
 | 
 |  |  |                         if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
 | 
 |  |  |                             TYPE.remove(listener);
 | 
 |  |  |                             ALL_TOPICS_EVENT.remove(listener);
 | 
 |  |  | 
 |  |  |         clear();
 | 
 |  |  |         ioThread.shutdownNow();
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | }
 |