1.注册EventBus
EventBus.getDefault().register(this);
1.1 getDefault() 双锁单例获取EventBus对象
1.2 register()
通过classs对象反射获取类中的方法
反射获取对象类中的方法,1,首先从缓存从获取 2,如果缓存 不存在通过反射获取类中的方法,同时缓存获取的到的方法
具体注册流程
2 取消注册
EventBus.getDefault().unregister(this);
2.1 获取当前注册类对象 对应的 订阅事件方法的参数类型 的集合
遍历参数类型集合,释放之前缓存的当前类中的Subscription
3 发送事件
EventBus.getDefault().post("Hello EventBus!")
post()方法先将发送的事件保存的事件队列,然后通过循环出队列,将事件交给postSingleEvent()方法处理:
根据eventInheritance属性,决定是否向上遍历事件的父类型,然后用 postSingleEventForEventType()方法进一步处理事件
遍历发送的事件类型对应的Subscription集合,然后调用postToSubscription()方法处理事件。
5 处理事件
据订阅事件方法的线程模式、以及发送事件的线程来判断如何处理事件,至于处理方式主要有两种: 一种是在相应线程直接通过invokeSubscriber()方法,用反射来执行订阅事件的方法,这样发送出去的事件就被订阅者接收并做相应处理了
主要就是从pendingPost中取出之前保存的event、subscription,然后用反射来执行订阅事件的方法,又回到了第一种处理方式。所以mainThreadPoster.enqueue(subscription, event)的核心就是先将将事件入队列,然后通过Handler从子线程切换到主线程中去处理事件
6 粘性事件
EventBus.getDefault().postSticky("Hello Sticky Eventbus!"); 发送事件时区分的,