EventBus笔记

官方的自我介绍:

简化组件之间通信 发送者与接收者处理逻辑的解耦 可以在activity, fragment, service之中完美运行 避免了与生命周期打交道,易于检测错误。

个人理解

一个发布事件,订阅事件的系统,与Android自身的广播相比,使用更加简单,不依赖context,可以在不同线程发送/处理事件。

源码实现

为了捉住这个库的主干,我对比看了EventBus的最初版本(即使用git切换到最初的版本),即实现一个最简单的逻辑。

EventBus作为一个单例,里面保存了两个最重要的Map。

1
2
3
4
5
//一个事件类型,拥有的的订阅Subscription,(subscriber,method)
//Subscription即表示一个订阅,里面保存着一个订阅者,一个当收到事件后的处理方法。
private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
//一个订阅者,对应订阅了多少个事件,即一个订阅者订阅了什么事件。
private final Map<Object, List<Class<?>>> typesBySubscriber;

了解这两个键值对,就能大概明白这个模块具体思路。

首先,订阅者Subscriber订阅了事件A,并在onEvent中表达了收到事件后要做什么,表示为method,内部将这个订阅关系保存到系统中, 有了一个Subscription(A,method),并将之放到Map<A,Subscription>中,并且,Subscriber对A事件的订阅关系,保存在typesBySubscriber中。 发布一个事件到EventBus,EventBus根据这个事件类型找到相关的对应关系,并调用该Subscription中的方法。