EventBus简介
EventBus是一种基于Android的事件发布-订阅总线。
EventBus官网描述:
- simplifies the communication between components
- decouples event senders and receivers
- performs well with Activities, Fragments, and background threads
- avoids complex and error-prone dependencies and life cycle issues
- makes your code simpler
- is fast
- is tiny (~50k jar)
- is proven in practice by apps with 100,000,000+ installs
- has advanced features like delivery threads, subscriber priorities, etc.
大致的意思是:EventBus能够简化各个组件之间的通信,解耦了事件发送与接收,让我们的代码更简洁快速,包50KB体积小,支持不同线程切换,具有优先级等特性。
EventBus源码分析
从函数构建开始分析:
- EventBus#getDefault()
1 | //使用 volatile 关键字 使得线程可见 |
事件的订阅:
- EventBus#getDefault()#register(Object)
1 | //订阅事件的入口 |
- 首先分析一下如何获取订阅者方法
1 | //查找订阅者方法 |
- findUsingInfo(subscriberClass),这里有两种情况注意:
1 | private List<SubscriberMethod> findUsingInfo(Class<?> subscriberClass) { |
- 通过反射方式获取
1 | //直接调用反射获取 |
上述基本的获取 @Subscribe 注解分析到此就结束了,下面是分析获取到的method 及 eventType存储及订阅
- register()中的遍历集合中的SubscriberMethod,然后调用此方法subscribe()存储及订阅
1 | private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) { |
注意:粘性事件存储在stickyEvents中,如果遍历的时候发现这个订阅方法为粘性,遍历stickyEvents集合,判断如果存在相同的eventType,则立即发送,到这里register()所有的源码分析就结束了。
事件的发送
EventBus通过post(obj)发送事件,期间包括线程的切换等
- post 发送事件event
1 | public void post(Object event) { |
- postSingleEvent
1 | private void postSingleEvent(Object event, PostingThreadState postingState) throws Error { |
- postSingleEventForEventType
1 | private boolean postSingleEventForEventType(Object event, PostingThreadState postingState, Class<?> eventClass) { |
- postToSubscription()
最终调用,通过threadMode进行相应的处理,通过反射、Handler.sendMessage()、提交任务至线程池执行
1 | private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) { |
EventBus主要是通过维护一个线程池与Handler,在不同的thredMode下进行事件的分发调用,这就所谓的不同threadMode下执行的环境也是不同
线程切换的两个类
- HandlerPoster
通过传入UI线程中的looper创建Handler使其在主线程中处理相应的Subscriber方法
1 | public class HandlerPoster extends Handler implements Poster { |
- BackgroundPoster
用于处理异步任务,通过run()中执行相应事件的调用,所有任务提交至线程池中处理
1 | final class BackgroundPoster implements Runnable, Poster { |
AsyncPoster与BackgroundPoster类似,都是通过提交run至线程池处理,公用一个线程池
订阅注销操作
1 | public synchronized void unregister(Object subscriber) { |
到这里EventBus主要源码分析到此就结束了,感谢收看。