当前位置: 首页 > news >正文

网站电脑培训班附近有吗宁夏建设厅官方网站

网站电脑培训班附近有吗,宁夏建设厅官方网站,html在网站开发中的应用,网站后台排版工具前言EventBus的核心思想是观察者模式 (生产/消费者编程模型) 。通过前面的文章我们已经知道#xff0c;如何使用eventBus了。我们需要先定义一个Observer(前文中的EventListener类)#xff0c;然后将其注册到eventBus里#xff0c;通过 Subscribe 定义消息回调函数。那我们先…前言EventBus的核心思想是观察者模式 (生产/消费者编程模型) 。通过前面的文章我们已经知道如何使用eventBus了。我们需要先定义一个Observer(前文中的EventListener类)然后将其注册到eventBus里通过 Subscribe 定义消息回调函数。那我们先看看register(Object object) 和unregister(Object object) 方法。register (Object object) 解析public void register(Object object) {Multimap, EventSubscriber methodsInListener finder.findAllSubscribers(object);subscribersByTypeLock.writeLock().lock();try {subscribersByType.putAll(methodsInListener);} finally {subscribersByTypeLock.writeLock().unlock();}}12345678910publicvoidregister(Objectobject){Multimap,EventSubscribermethodsInListenerfinder.findAllSubscribers(object);subscribersByTypeLock.writeLock().lock();try{subscribersByType.putAll(methodsInListener);}finally{subscribersByTypeLock.writeLock().unlock();}}可以看到是先通过SubscriberFindingStrategy接口里的findAllSubscribers方法获取所有标记了 Subscribe 注解的方法其中该接口的具体实现是AnnotatedSubscriberFinder类。放到一个guava里定义的Multimap里。然后是把获取到的methodsInListener放到一个叫subscribersByType的 guava里定义的SetMultimap里 。public Multimap, EventSubscriber findAllSubscribers(Object listener) {Multimap, EventSubscriber methodsInListener HashMultimap.create();Class clazz listener.getClass();for (Method method : getAnnotatedMethods(clazz)) {Class[] parameterTypes method.getParameterTypes();Class eventType parameterTypes[0];EventSubscriber subscriber makeSubscriber(listener, method);methodsInListener.put(eventType, subscriber);}return methodsInListener;}1234567891011publicMultimap,EventSubscriberfindAllSubscribers(Objectlistener){Multimap,EventSubscribermethodsInListenerHashMultimap.create();Classclazzlistener.getClass();for(Methodmethod:getAnnotatedMethods(clazz)){Class[]parameterTypesmethod.getParameterTypes();ClasseventTypeparameterTypes[0];EventSubscribersubscribermakeSubscriber(listener,method);methodsInListener.put(eventType,subscriber);}returnmethodsInListener;}findAllSubscribers方法里最重要的是methodsInListener它的结构可以简单理解为一个map其中key是eventType在我前文写的例子中就是com.sww.eventbus.domain.MessageEvent其中value是subscriber就是例子中的com.sww.eventbus.listener.EventListener#onMessageEvent。总之一句话就是先通过标记找到所有已经注册进来的观察者然后存放到容器里备用。那unregister就是从容器删除它们unRegister (Object object) 解析public void unregister(Object object) {Multimap, EventSubscriber methodsInListener finder.findAllSubscribers(object);for (Entry, Collection entry :methodsInListener.asMap().entrySet()) {Class eventType entry.getKey();Collection eventMethodsInListener entry.getValue();subscribersByTypeLock.writeLock().lock();try {Set currentSubscribers subscribersByType.get(eventType);if (!currentSubscribers.containsAll(eventMethodsInListener)) {throw new IllegalArgumentException(missing event subscriber for an annotated method. Is object registered?);}currentSubscribers.removeAll(eventMethodsInListener);} finally {subscribersByTypeLock.writeLock().unlock();}}}1234567891011121314151617181920publicvoidunregister(Objectobject){Multimap,EventSubscribermethodsInListenerfinder.findAllSubscribers(object);for(Entry,Collectionentry:methodsInListener.asMap().entrySet()){ClasseventTypeentry.getKey();CollectioneventMethodsInListenerentry.getValue();subscribersByTypeLock.writeLock().lock();try{SetcurrentSubscriberssubscribersByType.get(eventType);if(!currentSubscribers.containsAll(eventMethodsInListener)){thrownewIllegalArgumentException(missing event subscriber for an annotated method. Is object registered?);}currentSubscribers.removeAll(eventMethodsInListener);}finally{subscribersByTypeLock.writeLock().unlock();}}}post( Object event)解析有了观察者下面就是发送事件了阅读过前文会知道是通过eventBus.post(Object event)来发送事件消息。那咱们来看看这个post方法。public void post(Object event) {Set dispatchTypes flattenHierarchy(event.getClass());boolean dispatched false;for (Class eventType : dispatchTypes) {subscribersByTypeLock.readLock().lock();try {Set wrappers subscribersByType.get(eventType);if (!wrappers.isEmpty()) {dispatched true;for (EventSubscriber wrapper : wrappers) {enqueueEvent(event, wrapper);}}} finally {subscribersByTypeLock.readLock().unlock();}}if (!dispatched !(event instanceof DeadEvent)) {post(new DeadEvent(this, event));}dispatchQueuedEvents();}1234567891011121314151617181920212223242526publicvoidpost(Objectevent){SetdispatchTypesflattenHierarchy(event.getClass());booleandispatchedfalse;for(ClasseventType:dispatchTypes){subscribersByTypeLock.readLock().lock();try{SetwrapperssubscribersByType.get(eventType);if(!wrappers.isEmpty()){dispatchedtrue;for(EventSubscriberwrapper:wrappers){enqueueEvent(event,wrapper);}}}finally{subscribersByTypeLock.readLock().unlock();}}if(!dispatched!(eventinstanceofDeadEvent)){post(newDeadEvent(this,event));}dispatchQueuedEvents();}该方法就是从之前的容器subscribersByType里获取到eventType对应的观察者然后组装成EventWithSubscriber放到队列里。void enqueueEvent(Object event, EventSubscriber subscriber) {eventsToDispatch.get().offer(new EventWithSubscriber(event, subscriber));}123voidenqueueEvent(Objectevent,EventSubscribersubscriber){eventsToDispatch.get().offer(newEventWithSubscriber(event,subscriber));}然后就是最后的dispatchQueuedEvents()经过一层层深入进去可以发现wrapper.handleEvent(event)其中 handleEvent方法就是最终的关键了public void handleEvent(Object event) throws InvocationTargetException {checkNotNull(event);try {method.invoke(target, new Object[] { event });} catch (IllegalArgumentException e) {throw new Error(Method rejected target/argument: event, e);} catch (IllegalAccessException e) {throw new Error(Method became inaccessible: event, e);} catch (InvocationTargetException e) {if (e.getCause() instanceof Error) {throw (Error) e.getCause();}throw e;}}123456789101112131415publicvoidhandleEvent(Objectevent)throwsInvocationTargetException{checkNotNull(event);try{method.invoke(target,newObject[]{event});}catch(IllegalArgumentExceptione){thrownewError(Method rejected target/argument: event,e);}catch(IllegalAccessExceptione){thrownewError(Method became inaccessible: event,e);}catch(InvocationTargetExceptione){if(e.getCause()instanceofError){throw(Error)e.getCause();}throwe;}}就是通过Java的反射机制实现。需要说明的是如果没有订阅者注册到要发送的event事件上并且该event不是DeadEvent那么它将被包装成DeadEvent中并重新发布。也就是其中这三行代码索要做的if (!dispatched !(event instanceof DeadEvent)) {post(new DeadEvent(this, event));}123if(!dispatched!(eventinstanceofDeadEvent)){post(newDeadEvent(this,event));}本文系本人原创如要转载请注明出处浏览量:1410
http://wiki.neutronadmin.com/news/356692/

相关文章:

  • 企业网站建设实训网站怎么做qq的授权登陆
  • 平度好的建设网站网站互点联盟
  • 深圳互助资金盘网站开发简述一个网站开发流程
  • 全屏的网站营销网站建设公司地址
  • 做网站留后门是怎么回事用dw做网站怎么添加背景图片
  • 购物网站开发教程 视频网站建设交流发言
  • php靓号网站源码网站建设武清
  • 成都动力无限网站推广优化生育政策
  • 网站建设丷金手指花总比地招标网官网
  • 郑州网站建站模板客户关系管理
  • 网站建设需要具备哪些知识网站建设要用H5吗
  • 陕西省教育类网站前置审批ppt免费下载
  • 中英文网站源码 免费为什么营销型网站比普通网站建站贵
  • 济南智能网站建设哪家便宜word模板网站
  • 坑梓网站建设咨询网站做百度地图怎么做呢
  • 任意的关键词或网站做引流个人网页设计作品下载
  • 米枫网站怎么做分页discuz轻社区模板
  • 建模素材免费网站南宁自助建站模板
  • 二手交易网站开发技术路线青岛外贸推广
  • 点击量高的网站威海建设集团的网站是什么
  • 成都易站网站建设秦皇岛制作网站
  • 涪陵网站设计德国诺莫斯手表网站
  • 深圳做外贸网站的公司店铺推广方法有哪些
  • 公司网站网页设计装饰网站建设公司
  • 丹东电信网站备案宁波网页开发费用
  • 公司的宣传网站应该怎么做王色网站
  • net网站开发做兼职的网站策划书
  • 做h5那个网站好wordpress divi 教程
  • 网站开发专业有哪些哈尔滨 门户网站
  • 网站建设费用折旧年限河南无限动力做网站怎么样