首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【EventBus】EventBus 源码解析 ( 注册订阅者 | 注册订阅方法详细过程 )

* * 订阅服务器具有必须由{@link Subscribe}注释事件处理方法。...* {@link Subscribe}注释还允许类似{@link ThreadMode}和优先级配置。...* 事件处理方法必须由{@link Subscribe}注释,必须是公共,不返回任何内容(void), * 并且只有一个参数(事件)。...// 该 HashMap 用途是保存当前 eventType 对应所有的订阅和订阅方法 // 以便消息中心获取对应类型消息后 , 可以顺利将其传递给相应订阅方法...// 注意:迭代所有事件可能效率低下,因为有很多粘性事件, // 因此,应更改数据结构以允许更高效查找 // 例如,存储子类附加映射

38610
您找到你想要的搜索结果了吗?
是的
没有找到

(juc系列)flow响应式流接口及submissionpublisher实现

本文源码基于: JDK13 Flow 官方注释翻译 一些接口和静态方法,为了建立流式组件, Publisher生成元素,被一个或者多个Subscriber消费,每一个Subscriber被Subscription...示例: 一个Flow.Publisher通常定义了他自己Subscription实现,在subscribe方法中创建一个,然后叫他交给Flow.Subscriber。...这个还可以作为生成项子类一个基础,并使用这个方法来发布他们。 比如: 这里有一个周期性发布发布元素....(实际上,您可以添加方法来独立启动和停止,在发布者之间共享线程池等等,或者使用SubmissionPublisher作为一个组件而不是.)...它使用单步请求他发布者, 适应性更强版本可以使用提交返回延迟及其方法来监控流.

1.3K20

拆轮子系列之剖析EventBus源码

那么我们来列举几个常用属性加以讲解: //默认地,EventBus会考虑事件,即事件如果继承自,那么该也会作为事件发送给订阅者。...,均有注释 //......,那么这个必须有一个订阅方法,以@Subscribe注解标记方法,接着调用register()方法来进行注册。...从FindState#checkAdd深入一系列方法作用: - 允许一个有多个参数相同订阅方法 - 子类继承并重写了父订阅方法,那么只会把子类订阅方法添加到订阅者列表,父方法会忽略...,把subscriberMethods不断逐层返回,直到返回EventBus#register()方法,最后开始遍历每一个订阅方法,并调用subscribe(subscriber, subscriberMethod

34110

锦囊篇|一文摸懂EventBus

> subscriberClass = subscriber.getClass(); // 就是当前Activity中寻找到带有@Subscribe注解方法集合 List...,其实还是一个很简单逻辑,我们在代码中加入了一个标志性注释嘛,想起来了嘛,查询查就是我们带@Subscribe方法们。...到此为止我们就能够获得我们打过注解方法们了。 正式注册 接下来是一段长到要命代码,不过会尽量给出详细注释帮助理解。...} 我们发现还没有被用到,但是上述查询方法中出现了一个共同特征,就是调用了postSingleEventForEventType(),那就继续深入探寻。...post()方法,但是这里我们需要想起是我们之前尚未分析subscribe()中针对粘性事件做出处理方法

39520

Greenrobot-EventBus源码学习(五)

) 注解方式获取 从下面的代码可以看出,获取注解方法流程是: 获取所有方法 只有一个参数方法,判断是否有 @subscribe注解 其他都过滤(视情况是否抛异常出来) private void..., 实现主要区别是Guava多了一个获取过程 - Guava获取所有的, 根据每个 `getDeclaredMethods` 获取所有的方法,然后判断是否有注解 - Greenrobot...,即便父私有方法也是可以, static也无所谓 Greenrobot 中限制了方法作用域共有的非静态方法,有且只有一个参数,而且只是对当前而言 非注解方式 支持非注解方式进行注册,主要借助SubscriberInfoIndex...我们可以倒推一下这个设计思路: 注册,首先是要确定将哪些方法注册到 EventBus 排除掉注解方式;还有一种常见就是我们定义一种方式,可以将我们需要注册方法直接返回 定义一个接口,用于返回注册所有订阅信息...如何获取某注解方法,这个使用和guava有些区别,特别是对以及作用域情况处理 非注解方式注册 典型借用辅助(SubscriberInfoIndex)来完成预期目标 此外实现细节上也可以看看

62660

mono subscribe源码分析

上面仅仅是声明阶段,并没有产生实际效果,只有经过了subscribe之后才开始工作,下面就用上面的代码来分析下整个工作流程。.../*** **该方法会根据声明部分创建完整发布、订阅关系链 *本例子中涉及到下面几个订阅者:LambdaMonoSubscriber、MapFuseableSubscriber以及...subscribe方法会调用其subscriber(即FilterFuseableSubscriber)onSubscribe方法,然后进入onSubscribe阶段,onSubscribe调用顺序跟声明阶段相同...,当onSubscribe传到subscribe方法订阅者时将进入request阶段,request阶段执行顺序跟声明阶段相反,当request阶段执行到数据源端又会触发调用阶段执行,常见subscriber.onNext...方法 publisher.subscribe(subscriber); }

79010

Rxjava源码解析笔记 | 创建Observable 与 ObserverSubscriber 以及之间订阅实现源码分析

简单回顾 如果抛开Rxjava操作符以及其线程控制的话,Rxjava最基本使用是比较简单 第一步,创建被观察者Observable; 第二步,创建观察者Observer/Subscriber..., 被观察者用来通知观察者notifyObservers()方法Subscriber(观察者) 一个核心方法 subscribe() 订阅方法, 完成观察者和被观察者之间订阅; Rxjava..., 构造一个新Observable对象, 同时借助Observable原生构造方法, 将传进来OnSubscribe对象赋给全局变量onSubscribe; 如此便完成了被观察者Observable...中没有任何事件了, 即列表中所有的事件都被取消订阅了; 那么这个List也就为空; 以上则是Subscriber核心逻辑; ---- 第三步,下面具体分析订阅实现 下面小结一下,call()方法在...接着, subscriber.onStart();, 跟进一下onStart(), 可以发现它其实是Subscriber一个空方法; 默认什么都不做,需要我们自己调用时候去实现; 要把传进来

1.5K30

EventBus源码分析之订阅流程

: @Subscribe修饰方法只能有一个参数 @Subscriber修饰方法必须是public、non-static、non-abstract 当符合了条件并且是@Subscribe注解修饰方法...这里我们需要分析,当一个事件类型出现了两个及其以上订阅方法时,就会进入到二层检查;而从代码中可以看到,如果有多个订阅同一事件方法,那么existing将会在method和findstate中来回切换...如果父中也有该方法并且也是同一事件订阅方法,那么在查找父订阅方法时,methodClassOld将不为null。...{title='hello', content='world'} readMagazine2(): Magazine{title='hello', content='world'} 可以看到父方法没有打出日志...至此,可以分析完了订阅者是如何将自己订阅到事件中心,要点有如下几点: EventBus保存了订阅者以及其中所有@Subscribe注解了方法; 订阅者+订阅方法是一个元组; 如果事件是Sticky

63941

这操作真香!三幅图给你弄懂EventBus核心原理

>>> typesBySubscriber; EventBus会在对象register时,使用反射机制,遍历对象方法,将带有@Subscribe标签并且合法方法加入到typesBySubscriber...; } } 上面的代码主要做两件事:1、通过反射遍历注册对象方法,获取其中带有@Subscribe标签方法并且放在一个列表中,最后以注册对象为key,@Subscribe方法列表作为...要理解register实质上是将订阅对象(比如activity)中每个带有subscriber方法找出来,最后获得调用就是这些方法。...2、后注册对象中sticky方法能够收到之前stickyEvent方法原因是EventBus中维护了stickyEventhashMap表,在subsribe注册时候就遍历其中有没有注册监听stickyEvent...缺点: 1、使用时候有定义很多event, 2、event在注册时候会调用反射去遍历注册对象方法在其中找出带有@subscriber标签方法,性能不高。

56300

看看代码-EventBus

register方法注册,并给需要接受和处理消息方法加上Subscribe注解 public class MainActivity extends AppCompatActivity { @Override...查看EventBus源码,在EventBus.class中有几个比较重要变量 eventTypesChahe : 存储Event.class相关,包括Event、以及其实现接口 subscriptionsByEventType...跟subscribe中,主要流程: EventBust.getDefault().register(Subscriber) r 找到Subscriber中所有需要接收消息方法(SubscriberMethod...,使用不同Poster,在对应线程中对订阅方法进行反射调用,实现消息接收和处理 总结 EventBus通过对订阅者和发布者解耦,简化了消息发送和注册流程,且消息主体可以为任意对象,使得消息虽然在...EventBus代码量不多,算是一个比较轻量框架,暂不支持跨进程消息传递,且由于EventBus中维护Subscriber引用都是强引用,没有及时unregister的话,可能会导致内存泄漏。

55560

EventBus源码解读

(subscriber, subscriberMethod); } } } 1.获取当前订阅者 2.获取当前中被@Subscriber注解方法即订阅方法,详情请看findSubscriberMethods...即public、private等 4.只查看修饰符是public方法 5.返回该方法参数类型 6.只查看被@subscribe注解方法,即订阅方法。...7.把订阅方法添加到FindState集合中 二、subscribe 上面findSubscriberMethods查找到所有订阅方法,接下来需要对这些订阅方法处理,比如订阅方法不能存在重复、按照订阅内容类型为...方法 3.没有找到subscription订阅事件情况下会抛错No subscribers registered for event或者sendNoSubscriberEvent不为空情况则发送NoSubscriberEvent...一、lookupAllEventTypes 遍历订阅内容及其,存放到eventTypesCache中。 private static List<Class<?

38320

android EventBus详解(二)

Subscribe流程 我们继续来看EventBus,分析完了包含属性,接下来我们看入口方法register() 通过查看源码我们发现,所有的register()方法,最后都会直接或者间接调用...没错,SubscriberMethodFinder就是查看传进去那个 this 对象里面有没有onEvent()方法。怎么做到?当然是反射。而且这个用了大量反射去查找方法名。...还有一个skipMethodVerificationForClasses,看到注释是需要跳过被校验方法,校验方法是什么?看看他是干什么。...这回可以看懂了,就是拿到指定全部订阅方法(以 onEvent 开头方法),并对每一个方法调用subscribe()。那么再看subscribe()方法。...事件处理与发送subscribe() subscribe()方法接受四个参数,分别为:订阅者封装对象、响应方法名封装对象、是否为粘滞事件(可理解为广播)、这条事件优先级。

755100

Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线

文件或者反射来获得该类中订阅方法 遍历这个所有订阅方法,挨个添加到订阅列表 拿到中使用 Subscribe 注解修饰订阅方法 register() 方法中调用了我们前面介绍 subscriberMethodFinder.findSubscriberMethods...() 方法得到注册中使用 Subscribe 注解修饰方法。...保存订阅方法 下一步就是:遍历这个所有订阅方法,挨个添加到订阅列表,调用 subscribe() 方法: private void subscribe(Object subscriber, SubscriberMethod...,这里简单概括一下,subscribe() 方法主要做了这些事: 判断这个方法之前是否订阅过这个事件,重复订阅会抛出异常 之前没订阅过的话就把方法参数,也就是我们订阅事件 与当前以及该事件订阅方法映射关系保存到...带有注释源码地址 Thanks 本来打算自己画流程图和,但发现前辈画已经很完美的,而且我也有点困,就借用一下吧 -。-。

1.4K50

SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做设计(2)

Flux 之间无论怎么拼接都会保持链路信息: 自定义 Mono 和 Flux 工厂 公共 Subscriber 封装,将 reactor Subscriber 所有关键接口,都检查当前上下文是否有链路信息...,即 Span,如果没有就包裹上,如果有则直接执行即可。...TracedFlux,和所有 Mono 代理 TracedMono,其实就是在 subscribe 时候,用 TracedCoreSubscriber 包装传入 CoreSubscriber:...GlobalFilter - CommonTraceFilter 我们编写所有我们后面要实现 GlobalFilter 抽象,这个抽象主要功能是: 保证继承这个抽象 GlobalFilter...* 主要保证 span 完整性,在某些情况下,span 会半途停止,导致日志中没有 traceId 和 spanId * 参考:https://github.com/spring-cloud/spring-cloud-sleuth

24430

Greenrobot-EventBus源码学习(四)

EventBus.getDefault() 默认实例 这里使用了最常见延迟加载单例模式,来获取实例,注意下 snchronized 使用位置,并没有放在方法签名上( 注意这个不是严格意义上单例...SubscriberMethod 订阅者回调方法封装 这个主要保存就是订阅者回调方法相关信息 final Method method; final ThreadMode threadMode...; // 监听事件类型, 也就是注册方法唯一参数类型 final Class<?...Subscribe 注解 注解标注在唯一参数公共方法上, 表示这个方法就是我们注册订阅者回调方法 @Documented @Retention(RetentionPolicy.RUNTIME)...SubscriberMethodFinder 辅助工具,获取订阅者中回调方法 顾名思义,这个就是用来获取订阅者所有注册方法,支持两种方式,一个是上面的注解方式;还有一个则是利用SubscriberInfo

1.4K90

EventBus源码学习笔记(二)

中,所有包含@Subscribe 注解方法捞出来 方法第一个参数就是 Event, 因为注册目的是为了实现回调, 所以封装一个,包含这个Listener对象引用 + 要执行方法 上面注册实际实现和上面的步骤差不多...,不仅将改对象中所有@Subscribe注解方法捞出来,连父也不放过;就是这个TypeToken.of(clazz).getTypes().rawTypes(); 从上面的限定,也可以看出,...+方法参数确认(MethodIdentifierequals方法重写了), 而不是直接用集合contains方法, 请注意其中区别) method.isAnnotationPresent(Subscribe.class...& equals 方法没有重写 到此, 注册完毕;注销方法和上面差不多,唯一区别是最后一个是向 subscribers 塞数据,一个是从其中删数据而已 题外话 如果我们想获取工程中所有包含某个注解可以怎么办...新技能 1.根据class,获取所有集合 (EventBus实际使用中,Event集合都塞入了缓存,加快查询速度) TypeToken.of(concreteClass).getTypes(

80650

并发编程 - Event Bus 设计模式

{ String topic() default "default-topic"; } @Subscribe要求注解在方法,注解时可指定topic,不指定情况下为默认topic(default-topic...实例和对应方法Subscriber对象没有任何特殊要求,就是普通不需要继承任何父或者实现任何接口 package com.artisan.busevent.impl; import com.artisan.busevent.annotations.Subscribe...String topic = subscribe.topic(); //当某topic没有Subscriber Queue时候创建一个 subscriberContainer.computeIfAbsent...> temp = subscriber.getClass(); //不断获取当前和父所有@Subscribe方法 while (temp !...不能暴露给外部,因此Registry被设计成了包可见,所设计EventBus对Subscriber没有做任何限制,但是要接受event回调则需要将方法使用注解@Subscribe进行标记(可指定

20320
领券