https://www.jianshu.com/p/d9516884dbd4
根据上面的讲解 来简化原理
EventBus.getDeafault.register(this)
1.传入对象,利用反射得到消息回调的方法列表
2.这些方法循环与对象绑:主要干了两件事情,加入两个map a.第一个map
subscriptionsByEventType (evnetType list<Subscription(sucriber, method)>)
方法的参数也就是消息类型eventType为key value为Subscription列表 Subscription传入了对象和方法. 这个map很重要就是post的时候需要根据eventType来获得 对象和方法 循环 反射调用
b.对象为key value为list list里面是方法参数类型
typesBySubscriber
(subscriber, list<eventType>())
这个map 用处不是特别大 主要就是用来判断对象有没有注册
EventBus.getDeafault.unregister(this)
正好是与register相反的一个过程
删除两个对应map里面相关的eventType 和subscribe
post(eventType)
可以获取到当前的线程状态
然后把eventType加入到队列里面
然后循环队列
根据eventType 去拿到list<subscription<suscriber, method>>
然后循环发送 event subscribtion 是否是主线程
接着上边的继续分析,postToSubscription()
内部会根据订阅事件方法的线程模式(method 上的注解有),间接或直接的以发送的事件为参数,通过反射执行订阅事件的方法。(异步的有线程池)