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<EventListener> ALL_TOPICS_EVENT = new ArrayList<>();//所有主题消息
|
|
private static final ArrayMap<Object, List<EventListener>> EVENT = new ArrayMap<>();
|
|
private static final ArrayMap<EventListener, Integer> 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<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<>());
|
}
|
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);
|
}
|
} 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<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) {
|
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();
|
}
|
|
|
}
|