EventBus系列文章(一) - register()、subscribe()、post()分析

前言

EventBus系列文章
EventBus系列文章(一) - register()、subscribe()、post()分析
EventBus系列文章(二) - 手写EventBus

1. 现象描述

1>:在MainActivity中注册 EventBus.getDefault().register(this);
2>:在MainActivity中注销 EventBus.getDefault().unregister(this);
3>:在需要接收的方法采用 注解Subscribe;
4>:在任意地方只需要调用 EventBus.getDefault().post(),就会执行 第3步的 Subscribe的注解方法,前提是同类型的对象:
A:比如 post里边是String类型,那么第3步的注解方法接收的就是String类型;
B:比如 post里边是JavaBean类型,那么第3步的注解方法接收的就是JavaBean类型;

2. 源码分析如下

1>:findSubscriberMethods(subscriberClass)方法

去解析注册者对象,比如是在MainActivity类中注册与注销,那么就从MainActivity中找出带有 Subscribe注解的方法,然后通过Annotation解析所有细节参数,也就是需要解析threadMode 、priority 、sticky、eventType、method,把这些参数封装成一个SubscriberMethod对象,然后添加到集合并返回
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky = true)

因为MainActivity中有2个方法有Subscribe注解,分别是test1和test2,这个时候,MainActivity与注解关系图如下:


MainActivity与注解关系图.png
2>:subscribe()

解析所有 SubscribeMethod所有的 eventType,然后按照要求解析成
Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType的格式,key是 eventType,value是 Subscription的列表,Subscription包含两个属性:subscriber,SubscriberMethod;
执行完 subscribe()方法之后,就变成如下图:


subscribe()执行完后的样子.png
3>:post()

遍历subscriptionsByEventType的map集合,也就是遍历test1()和test()2这两个方法,找到符合的方法,然后调用方法的 method.invoke()执行;

3>:unRegister()

移除

推荐阅读更多精彩内容