New file |
| | |
| | | package com.hdl.sdk.common.event; |
| | | |
| | | |
| | | import android.util.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.ConcurrentHashMap; |
| | | import java.util.concurrent.ExecutorService; |
| | | |
| | | |
| | | /** |
| | | * Created by Tong on 2021/9/22. |
| | | * 事件分发 |
| | | */ |
| | | public class EventDispatcher { |
| | | |
| | | private static final List<EventListener> ALL_TOPICS_EVENT = new ArrayList<>();//所有主题消息 |
| | | |
| | | private static final ConcurrentHashMap<Object, List<EventListener>> EVENT = new ConcurrentHashMap<>(); |
| | | |
| | | private static final ConcurrentHashMap<EventListener, Integer> TYPE = new ConcurrentHashMap<>(); |
| | | |
| | | 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<EventListener> 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<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()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public synchronized void post(Object tag, Object o) { |
| | | 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() { |
| | | 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(); |
| | | } |
| | | } |