自定义一个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);
EventBusPlus.getEventBusPlus().postEventMessageByClass(OrderDishesActivity.class, "ShoppingFoodListEvent");//刷新购物车菜品数据如果需要传参数(参数没有做限制)
EventBusPlus.getEventBusPlus().postEventMessageByClass(OrderDishesActivity.class, "NormsEvent", foodBean.getId(), position, foodBean);3:接收
@MethodEvent("NormsEvent") public void NotifyData() { }
0 0
- 自定义一个EventBus
- 一个新手接触EventBus
- 自定义eventbus 10多k
- EventBus猜想 ----手把手带你自己实现一个EventBus
- EventBus猜想 ----手把手带你自己实现一个EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- EventBus
- 使用Libgdx画线,如何设置宽度
- Neo4j安装
- linux中设备的访问mount/find
- JSP中ueditor的使用方法步骤
- Android的垃圾回收与内存泄露
- 自定义一个EventBus
- selenium3.3.1 + firefox47.0.2 + java8
- 图形数据库 Neo4j 开发实战
- 算法:RSA算法原理(一)
- 个人站长才能提高付费文章的转换收入率呢
- 关于如何在php7中使用mysqli扩展
- JS远程监测-Flume设置
- 彻底理解webservice SOAP WSDL
- 支持富文本插入图片,文本的自定义View