package com.base.event; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.SparseArray; import com.app.annotation.javassist.Bus; import com.base.util.LogUtils; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; /** * Created by baixiaokang on 16/11/15. */ public class OkBus { private ConcurrentHashMap<Integer, List<SparseArray<Event>>> mEventList = new ConcurrentHashMap<>();//存储所有事件ID以及其回调 private ConcurrentHashMap<Integer, Object> mStickyEventList = new ConcurrentHashMap<>();//存储粘连事件ID以及其数据 private ScheduledExecutorService mPool = Executors.newScheduledThreadPool(5); private Handler mHandler = new Handler(Looper.getMainLooper()); private OkBus() { } private static class Holder { public static OkBus eb = new OkBus(); } public static OkBus getInstance() { return Holder.eb; } public OkBus register(int tag, Event ev) { register(tag, ev, Bus.DEFAULT); return this; } public OkBus register(int tag, final Event ev, int thread) { SparseArray<Event> mEvent = new SparseArray<>(); mEvent.put(thread, ev); if (mEventList.get(tag) != null) { mEventList.get(tag).add(mEvent); } else { List<SparseArray<Event>> mList = new ArrayList<>(); mList.add(mEvent); mEventList.put(tag, mList); } LogUtils.e("Bus register", tag + " :" + mEventList.get(tag).size()); if (mStickyEventList.get(tag) != null) {//注册时分发粘连事件 final Message msg = new Message(); msg.obj = mStickyEventList.get(tag); msg.what = tag; callEvent(msg, ev, thread); LogUtils.e("mStickyEvent register and onEvent", tag + " :" + mEventList.get(tag).size()); } return this; } private void callEvent(final Message msg, final Event ev, int thread) { switch (thread) { case Bus.DEFAULT: ev.call(msg); break; case Bus.UI: mHandler.post(() -> ev.call(msg)); break; case Bus.BG: mPool.execute(() -> ev.call(msg)); break; } } public OkBus unRegister(int tag) { if (mEventList.get(tag) != null) mEventList.remove(tag); return this; } public OkBus onEvent(int tag, Object data) { Message msg = new Message(); msg.obj = data; msg.what = tag; if (mEventList.get(tag) != null) { LogUtils.e("Bus onEvent", tag + " :" + mEventList.get(tag).size()); for (SparseArray<Event> ev : mEventList.get(tag)) callEvent(msg, ev.valueAt(0), ev.keyAt(0)); } return this; } public OkBus onEvent(int tag) { onEvent(tag, null); return this; } public OkBus onStickyEvent(int tag, Object data) { LogUtils.e("Bus onStickyEvent", tag + " "); mStickyEventList.put(tag, (data == null ? tag : data)); onEvent(tag, data); return this; } public OkBus onStickyEvent(int tag) { onStickyEvent(tag, null); return this; } }