EventBus源码分析
来源:互联网 发布:notepad 和python 编辑:程序博客网 时间:2024/05/29 09:23
<h2 id="EventBus简介"><a href="#EventBus简介" class="headerlink" title="EventBus简介"></a>EventBus简介</h2><p>本篇基于EventBus 2.4撰写。</p>
Android optimized event bus that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.
上面是从官方repo拉来的代码,大致是说简化的组件之间的交流通信,减少代码,提高质量。
其实和EventBus最早是在qzone的代码里认识的,空间内部有一个叫eventcenter的东西,曾经有优化过一些,当时看源码实现的时候发现的原来是根据EventBus改的一个实现。大概就是把annotation的实现改成了接口实现,另外去掉了根据Event类型来找订阅者的模式,完全通过Event的TYPE类型常量来判断,register的时候直接指定对哪种TYPE感兴趣,辅助的判断则有事件发送者引用。这种实现见仁见智吧,虽然直接通过接口肯定是能提高性能的。这里要吐槽的是实现修改的时候,直接把很多对外的接口名字改掉了,何必呢。
EventBus的好处是显而易见的,完全解耦了请求链之间的关系,避免了请求者被长持有,又比广播更轻量,比LocalBroadcast则更强大,接口也简单实用。缺点的话,像是各种Event的定义是一个工作量。
源码分析 - 注册(register)
EventBus.java
:
register的时候,大致就是去subscriber里面首先找到那些onEvent方法(目前实现仍然是根据onEvent这个前缀),寻找的时候会去判断后缀,分为post线程、主线程、background线程,以及异步线程,官方repo提到这里之后在3.0可能会换成annotation的实现。
sticky参数是粘性事件概念,postSticky和registerSticky相对应,stickyEvent会记录该EventType对应的最后一次postSticky的事件,这样在registerSticky的时候,会立即检查是否有之前post的事件,从而避免了某些事件去实现自己的缓存。应用场景大概就是某些activity/fragment感兴趣的事件发生在创建前,这样则可以避免必须实现缓存(当然事实上应用场景还是比较少的,因为大部分东西我们还是会在哪里记录一下)
SubscriberMethod.java
:
SubscriberMethod里面记录了Method引用,线程模式(在findSubscriberMethods里拿到的),eventType,以及用来提高method.equals性能的methodString。
接着再看subscribe方法的实现,在register最后,对找到的所有方法都去执行了一遍subscribeEventBus.java
:
源码分析 - 发送事件(post)
再来看一下对应的post逻辑
EventBus.java
:
End
大致就讲了一下register和post这一对比较常用的接口,其他还有一些实现像是EventBusBuilder,SubscriberException,cancelEventDelivery,AsyncExecutor就不在这里进行赘述,之后可能会对AsyncExecutor单独开一篇讲一下,另外也会对otto的实现做一下分析。
转自:http://blog.zhaiyifan.cn/2015/08/20/EventBus-source/