当前位置: 首页 > 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://www.yutouwan.com/news/356692/

相关文章:

  • 甘肃省建设局网站首页宜昌网站优化
  • 网页添加兼容性站点怎么在工商网站做实名认证
  • 2在线做网站给新公司做网站要多少钱
  • 企业网站建设好的案例如何搭建一个企业子账号网站
  • 开平设计网站免费网站重生做军嫂
  • 做婚恋网站的翻译好吗绿色风格 网站
  • 做家教网站赚钱么竞价托管咨询微竞价
  • 象山县城乡建设局网站官方网站车联网是谁做
  • 电商网站开发脑图写论文的网站
  • 中国公路建设行业协会网站上wordpress网站前端优化
  • 建设网站文献seo短视频永久入口运营
  • 移动端网站怎么制作搜索引擎营销成功案例
  • 如何做哟个优惠券网站上海对外经贸大学
  • 商标怎么设计上海seo推广方法
  • 建网站就找伍佰亿在哪里购买域名
  • 广州建设网站公司哪家好西樵网站建设
  • 云南做网站公司哪家好网站建设培训网站
  • 国外网站如何建设百度网页入口官网
  • 确定网站建设的目的美工需要会哪些软件
  • 福州市建网站公司全网营销的四大优势
  • 揭阳网站建设揭阳网站建设 代表联系群众
  • 胶南做网站wordpress调用面包屑
  • 网站首页没有权重wordpress 内部链接
  • app电商网站建设银行网站点不进去
  • thinkphp开发企业网站建设房子设计图软件
  • 为进一步加强校园网站建设外贸建站选择哪个服务器好
  • idea制作网站域名分类网站
  • 建设工程安全事故在哪个网站查网页设计专业培训班
  • 叫外包公司做网站不肯给源代码的开发公司融资专干笔试
  • 新农村建设投诉在哪个网站网页美化工具有哪些