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 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()); } } } 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()); } } } public void remove(Object tag) { synchronized (this) { if (tag == null) { return; } try { if (EVENT.containsKey(tag)) { LogUtils.i("移除key:" + tag); List list = EVENT.get(tag); for (EventListener eventListener : list) { if (eventListener == null) { continue; } 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 ev = EVENT.get(tag); if (ev != null && !ev.isEmpty()) { TYPE.remove(listener); ev.remove(listener); } } } catch (Exception ignored) { LogUtils.e("移除event异常1:" + ignored.getMessage()); } } } public synchronized void post(Object tag, @NonNull Object o) { if (tag == null) { LogUtils.i("post tag为空"); return; } try { if (EVENT.containsKey(tag)) { LogUtils.i("post:" + tag); List 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() { try { if (listener != null) { listener.onMessage(o); } } catch (Exception e) { } } }); } } }catch (Exception e){ LogUtils.e("post异常2:" + e.getMessage()); } } /** * 注册所有主题消息的监听 * @param listener */ public synchronized void registerAllTopicsListener(EventListener listener) { if(listener==null){ return; } 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()); } } /** * 取消所有主题消息的监听 * @param listener */ public synchronized void removeAllTopicsListener(EventListener listener) { try { ioThread.execute(new Runnable() { @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); } } 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(); } }