基本的使用步骤就是如下4步,点击此链接查看例子及介绍。

  1. 定义事件类型:
    `public class MyEvent {}`
  2. 定义事件处理方法:
    `public void onEventMainThread`
  3. 注册订阅者:
    `EventBus.getDefault().register(this)`
  4. 发送事件:
    `EventBus.getDefault().post(new MyEvent())`

一.实现

**EventBus**使用方法很简单,但用一个东西,如果不了解它的实现用起来心里总是没底,万一出问题咋办都不知道,所以还是研究一下它的实现,肯定要Read the fucking Code。其实主要是`EventBus`这一个类,在看看Code时需要了解几个概念与成员,了解了这些后实现就很好理解了。

  • EventType:onEvent\*函数中的参数,表示事件的类型
  • Subscriber:订阅源,即调用register注册的对象,这个对象内包含onEvent\*函数
  • SubscribMethod:`Subscriber`内某一特定的onEvent\*方法,内部成员包含一个`Method`类型的method成员表示这个onEvent\*方法,一个`ThreadMode`成员threadMode表示事件的处理线程,一个`Class<?>`类型的eventType成员表示事件的类型`EventType`。
  • Subscription,表示一个订阅对象,包含订阅源`Subscriber`,订阅源中的某一特定方法`SubscribMethod`,这个订阅的优先级`priopity`


了解了以上几个概念后就可以看`EventBus`中的几个重要成员了


  
 // EventType -> List<Subscription>,事件到订阅对象之间的映射   privatefinal Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;  // Subscriber -> List<EventType>,订阅源到它订阅的的所有事件类型的映射  privatefinal Map<Object, List<Class<?>>> typesBySubscriber;   // stickEvent事件,后面会看到  privatefinal Map<Class<?>, Object> stickyEvents;  // EventType -> List<? extends EventType>,事件到它的父事件列表的映射。即缓存一个类的所有父类  privatestaticfinal Map<Class<?>, List<Class<?>>> eventTypesCache = new HashMap<Class<?>, List<Class<?>>>();


二. 注册事件:Register

通过`EventBus.getDefault().register`方法可以向`EventBus`注册来订阅事件,`register`有很多种重载形式,但大都被标记为`Deprecated`了,所以还是不用为好,前面说了事件处理方法都是以*onEvent*开头,其实是可以通过register方法修改的,但相应的方法被废弃了,还是不要用了,就用默认的*onEvent*,除下废弃的register方法,还有以下4个**public**的`register`方法

publicvoid register(Object subscriber) {    register(subscriber, defaultMethodName, false, 0);}publicvoid register(Object subscriber, int priority) {    register(subscriber, defaultMethodName, false, priority);}publicvoid registerSticky(Object subscriber) {    register(subscriber, defaultMethodName, true, 0);}publicvoid registerSticky(Object subscriber, int priority) {    register(subscriber, defaultMethodName, true, priority);}

可以看到,这4个方法都调用了同一个方法:

privatesynchronizedvoid register(Object subscriber, String methodName, boolean sticky, int priority) {    List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass(),methodName);    for (SubscriberMethod subscriberMethod : subscriberMethods) {        subscribe(subscriber, subscriberMethod, sticky, priority);    }}
由此可见:

第一个参数就是订阅源,第二个参数就是用到指定方法名约定的,默认为*onEvent*开头,说默认是其实是可以通过参数修改的,但前面说了,方法已被废弃,最好不要用。第三个参数表示是否是*Sticky Event*,第4个参数是优先级,这两个后面再说。

在上面这个方法中,使用了一个叫`SubscriberMethodFinder`的类,通过其`findSubscriberMethods`方法找到了一个`SubscriberMethod`列表,前面知道了`SubscriberMethod`表示Subcriber内一个onEvent\*方法,可以看出来`SubscriberMethodFinder`类的作用是在Subscriber中找到所有以methodName(即默认的onEvent)开头的方法,每个找到的方法被表示为一个`SubscriberMethod`对象。

`SubscriberMethodFinder`就不再分析了,但有两点需要知道:

  1. 所有事件处理方法**必需是`public void`类型**的,并且只有一个参数表示*EventType*。
  2. `findSubscriberMethods`不只查找*Subscriber*内的事件处理方法,**同时还会查到它的继承体系中的所有基类中的事件处理方法**。

找到*Subscriber*中的所有事件处理方法后,会对每个找到的方法(表示为`SubscriberMethod`对象)调用`subscribe`方法注册。`subscribe`方法干了三件事:

  1. 根据`SubscriberMethod`中的*EventType*类型将`Subscribtion`对象存放在`subscriptionsByEventType`中。建立*EventType*到*Subscription*的映射,每个事件可以有多个订阅者。
  2. 根据`Subscriber`将`EventType`存放在`typesBySubscriber`中,建立*Subscriber*到*EventType*的映射,每个Subscriber可以订阅多个事件。
  3. 如果是*Sticky*类型的订阅者,直接向它发送上个保存的事件(如果有的话)。

通过*Subscriber*到*EventType*的映射,我们就可以很方便地使一个Subscriber取消接收事件,通过*EventType*到*Sucscribtion*的映射,可以方便地将相应的事件发送到它的每一个订阅者。

接下来是对每个事件的具体分析。

更多相关文章

  1. Android设置颜色的几种方法
  2. Android SDK更新 Connection to http://dl-ssl.google.com refus
  3. RecyclerView 各种相关问题解决方法
  4. ListView CheckBox点击事件
  5. (四)Android事件分发机制 - 总结篇
  6. 关于安卓 TextView 添加点击事件
  7. Android基本控件常用属性及方法
  8. 【Android常用控件】EditText常用属性【二】:为文本输入框指定软
  9. Android事件处理之监听事件

随机推荐

  1. 修改进度条ProgressBar颜色
  2. 2011.07.11——— android 自定义toast
  3. android -- 框架 使用android快速开发框
  4. Android拦截、监听系统返回键事件
  5. Android(安卓)FFMPEG音视频开发(四)
  6. Android中全屏设置
  7. 读取Android设备的MAC地址
  8. Android(安卓)底部菜单栏RadioButton+Fra
  9. Android中dpi 和density到底是什么关系?
  10. 使用FragmentTabHost时,tabwidget被framen