自定义一个EventBus

来源:互联网 发布:网络qq音乐在线播放 编辑:程序博客网 时间:2024/06/07 22:27

最近公司做的项目是POS点菜机,根据需求发现用EventBus比较麻烦,

(一个消息只能一个订阅者接收,我想做的是,一个地方发消息,多处可以同时接收

所以就自己写了一个EventBusPlus

public class EventBusPlus {    private static final Map<String,Map<String ,SubscriberMethod>> CLASS_REGISTER_EVENT = new ConcurrentHashMap<>();    private static final Map<String,Map<String ,SubscriberMethod>> TAG_REGISTER_EVENT = new ConcurrentHashMap<>();    public static final String TAG = EventBusPlus.class.getSimpleName();    private static EventBusPlus eventBusPlus;    private EventBusPlus(){}    public synchronized static EventBusPlus getEventBusPlus(){        if(eventBusPlus == null){            synchronized (EventBusPlus.class){                if(eventBusPlus == null){                    eventBusPlus = new EventBusPlus();                }            }        }        return eventBusPlus;    }    /**     * 给指定的类发送消息     * @param targetClass   目标类的class     * @param tag     */    public void postEventMessageByClass(Class<?> targetClass, String tag, final Object... param){        if(targetClass == null || tag == null){            return;        }        String className = targetClass.getName();        if(CLASS_REGISTER_EVENT.containsKey(className)){            Map<String, SubscriberMethod> subscriberMethodMap = CLASS_REGISTER_EVENT.get(className);            if(subscriberMethodMap.containsKey(tag)){                final SubscriberMethod subscriberMethod = subscriberMethodMap.get(tag);                invokeMethod(subscriberMethod,param);            }        }    }    /**     * 给指定多个类发送消息     * @param targetClasss   目标类的class的数组     * @param tag   tag标记     * @param  param 参数     */    public void postEventMessageByClass(Class<?>[] targetClasss, String tag, final Object... param){        if(targetClasss != null){            for(Class clazz : targetClasss){                postEventMessageByClass(clazz,tag,param);            }        }    }    /**     * 给指定所有tag发送消息     * @param tag   目标tag     * @param param 参数     */    public void postEventMessageByTag(String tag, final Object... param){        if(tag == null){            return;        }        if(TAG_REGISTER_EVENT.containsKey(tag)){            Map<String, SubscriberMethod> subscriberMethodMap = TAG_REGISTER_EVENT.get(tag);            if(subscriberMethodMap != null && subscriberMethodMap.size() > 0){                Set<String> keys = subscriberMethodMap.keySet();                for(String key : keys){                    SubscriberMethod subscriberMethod = subscriberMethodMap.get(key);                    invokeMethod(subscriberMethod,param);                }            }        }    }    /**     * 调用方法     * @param subscriberMethod     * @param param     */    private void invokeMethod(final SubscriberMethod subscriberMethod,final Object... param){        LogUtil.logD(this.getClass().getSimpleName(),"invokeMethod "+subscriberMethod.getMethod().getName());        if(subscriberMethod.getThreadMode() == ThreadMode.THREAD_ASYN && Looper.getMainLooper() != Looper.myLooper()){            //异步处理            ThreadManager.getInstance().execute(new Runnable() {                @Override                public void run() {                    try {                        subscriberMethod.getMethod().invoke(subscriberMethod.getObj(),param);                    } catch (IllegalAccessException e) {                        e.printStackTrace();                    } catch (InvocationTargetException e) {                        e.printStackTrace();                    }                }            });        }else{            new Handler(Looper.getMainLooper()).post(new Runnable() {                @Override                public void run() {                    try {                        subscriberMethod.getMethod().invoke(subscriberMethod.getObj(),param);                    } catch (IllegalAccessException e) {                        e.printStackTrace();                    } catch (InvocationTargetException e) {                        e.printStackTrace();                    }                }            });        }    }    /**     * 注册监听     * @param obj   注册需要监听的类     */    public synchronized void registerEvent(Object obj){        if(obj == null){            Log.e(TAG,"register obj is null");            return;        }        registerSubscriberMethods(obj);    }    /**     * 取消监听     * @param obj   取消需要监听的类     */    public synchronized void unRegisterEvent(Object obj){        if(obj == null){            Log.e(TAG,"register obj is null");            return;        }        String className = obj.getClass().getName();        CLASS_REGISTER_EVENT.remove(className);        Set<String> keys = TAG_REGISTER_EVENT.keySet();        for(String key : keys){            Map<String, SubscriberMethod> subscriberMethods = TAG_REGISTER_EVENT.get(key);            if(subscriberMethods.containsKey(className)){                TAG_REGISTER_EVENT.get(key).remove(className);                break;            }        }    }    /**     * 查找此对象上所有注册监听方法的事件进行注册     * @param object   需要查找的类     * @return     */    private synchronized void registerSubscriberMethods(Object object){        Class<?> subscriberClass = object.getClass();        String className = subscriberClass.getName();        Map<String, SubscriberMethod> classSubscriberMethodMap = CLASS_REGISTER_EVENT.get(className);        Method[] methods = subscriberClass.getDeclaredMethods();        Map<String, SubscriberMethod> tagSubscriberMethodmap;        for (Method m: methods) {            m.setAccessible(true);            MethodEvent annotation = m.getAnnotation(MethodEvent.class);            if(annotation != null){                if(classSubscriberMethodMap == null){                    classSubscriberMethodMap = new ConcurrentHashMap();                }                String tag = annotation.value();                if(!TAG_REGISTER_EVENT.containsKey(tag)){                    tagSubscriberMethodmap = new ConcurrentHashMap<>();                }else{                    tagSubscriberMethodmap = TAG_REGISTER_EVENT.get(tag);                }                ThreadMode threadMode = annotation.threadMode();                Class<?>[] parameterTypes = m.getParameterTypes();                SubscriberMethod subscriberMethod = new SubscriberMethod(object,subscriberClass,threadMode,m,parameterTypes,tag);                classSubscriberMethodMap.put(tag,subscriberMethod);                //缓存TAG类型的事件                tagSubscriberMethodmap.put(className,subscriberMethod);                TAG_REGISTER_EVENT.put(tag,tagSubscriberMethodmap);            }        }        if(classSubscriberMethodMap != null && classSubscriberMethodMap.size() > 0){            CLASS_REGISTER_EVENT.put(className,classSubscriberMethodMap);        }    }}


用法:

1:注册

基本一样

EventBusPlus.getEventBusPlus().registerEvent(this);


2:发送

 EventBusPlus.getEventBusPlus().postEventMessageByClass(OrderDishesActivity.class, "ShoppingFoodListEvent");//刷新购物车菜品数据
如果需要传参数(参数没有做限制)

 EventBusPlus.getEventBusPlus().postEventMessageByClass(OrderDishesActivity.class, "NormsEvent", foodBean.getId(), position, foodBean);
3:接收

  @MethodEvent("NormsEvent")    public void NotifyData() {       }





0 0
原创粉丝点击