package com.hdl.sdk.common.event; import androidx.annotation.NonNull; import androidx.collection.ArrayMap; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.ThreadToolUtils; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.concurrent.ExecutorService; /** * Created by Tong on 2021/9/22. * 事件分发 */ public class EventDispatcher { private static final List ALL_TOPICS_EVENT = new ArrayList<>();//所有主题消息 private static final ArrayMap> EVENT = new ArrayMap<>(); private static final ArrayMap TYPE = new ArrayMap<>(); private static final int MAIN_TYPE = 0; private static final int IO_TYPE = 1; private static final ExecutorService ioThread = ThreadToolUtils.getInstance().newFixedThreadPool(3); private 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<>()); } List 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<>()); } List 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 list = EVENT.get(tag); for (EventListener eventListener : list) { TYPE.remove(eventListener); } EVENT.remove(tag); } } catch (Exception ignored) { LogUtils.e("移除event异常1:"+ignored.getMessage()); } } }); }catch (Exception e){ LogUtils.e("移除event异常2:"+e.getMessage()); } } public synchronized void remove(Object tag, EventListener listener) { try { ioThread.execute(new Runnable() { @Override public void run() { try { if (EVENT.containsKey(tag)) { List 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 list = EVENT.get(tag); if (list != null && !list.isEmpty()) { for (EventListener listener : list) { ThreadToolUtils.getInstance().runOnUiThread(new Runnable() { @Override public void run() { if (listener != null) { listener.onMessage(o); } } }); } } } //所有主题的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); } } }); } } } /** * 注册所有主题消息的监听 * @param listener */ public synchronized void registerAllTopicsListener(EventListener listener) { if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.contains(listener)) { ALL_TOPICS_EVENT.add(listener); } TYPE.put(listener, MAIN_TYPE); } /** * 取消所有主题消息的监听 * @param listener */ public synchronized void removeAllTopicsListener(EventListener listener) { try { ioThread.execute(new Runnable() { @Override public void run() { try { if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) { TYPE.remove(listener); ALL_TOPICS_EVENT.remove(listener); } } catch (Exception ignored) { LogUtils.e("移除event异常1:" + ignored.getMessage()); } } }); } catch (Exception e) { LogUtils.e("移除event异常2:" + e.getMessage()); } } public synchronized void clear() { ALL_TOPICS_EVENT.clear(); EVENT.clear(); TYPE.clear(); } public synchronized void release() { clear(); ioThread.shutdownNow(); } }