一篇带给你EventBus原理解析

一篇带给你EventBus原理解析,EventBus的定义始于register方法:,register方法主要是从订阅者class对象中找出所有订阅消息的方法列表,然后对每个订阅方法调用subscribe进行订阅:,
,register方法中的subscriberMethodFinder.findSubscriberMethods(subscriberClass),它从订阅者class对象中找到要所有要订阅的事件,我们看看它是怎么实现的:,EventBusAnnotationProcessor 是EventBus的编译期注解处理器实现类,其核心源码如下:,编译器注解处理器主要做:,从编译期生成的订阅者/事件索引类文件中查找订阅方法列表的入口是findUsingInfo:,从索引类中找到订阅者class对应的订阅信息对象的源码如下:,EventBus是不是这样的处理逻辑呢,我们来看看其发布源码,EventBus的发布消息入口是post方法:,post主要做的是将消息加入队列中,并遍历队列对每个消息进行一一发布,我们继续看下postSingleEvent:,一种仅支持消息本身类型,则直接发布当前消息,我们继续往下看postSingleEventForEventType:,我们继续往下看postToSubscription:,postToSubscription中主要是对线程模型进行处理:,直接处理消息的是通过invokeSubscriber方法,看名称就是表示反射调用订阅者的订阅方法处理消息,那是不是呢?我们看看其源码实现:,不管MAIN还是MAIN_ORDERED都是通过mainThreadPoster,将消息放入mainThreadPoster的队列中,mainThreadPoster其实就是主线程中的Handler:,mainThreadPoster默认是通过MainThreadSupport.AndroidHandlerMainThreadSupport.createPoster创建的,也就是mainThreadPoster默认是HandlerPoster的实例对象,我们看看HandlerPoster:,切换到子线程处理消息是通过backgroundPoster的enqueue方法,backgroundPoster是BackgroundPoster的实现类,我们看看其内部实现:,其中默认使用的线程池是缓存线程池:,异步消息是通过asyncPoster的enqueue方法实现,asyncPoster是AsyncPoster的实例对象,它本身就是一个线程,我们看看其实现:,异步消息使用的线程池跟BACKGROUND模式使用的线程池是同一个,都是缓存线程池,与BACKGROUND的区别是:,图片,
,

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/22212.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34