Android 开发之EventBus(2月4日 55%)

一、简介:

EventBus是一款针对Android优化的发布/订阅事件总线。

主要功能:替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。(避免了使用handler、AsynTask,接口回调)

优点:开销小,代码更优雅,将发送者和接收者进行解耦。独立出一个发布订阅模块,调用者可以通过使用这个模块,屏蔽一些线程切换问题,简单地实现发布订阅功能。

缺点:大量的滥用,将导致逻辑的分散,出现问题后很难定位。

总得来说,如果项目里面有大量的事件交互,那么还是可以通过EventBus来实现,否则还是推荐自己在模块内部实现观察者模式

二、基本用法

EventBus框架中涉及四个成分:订阅者,发布者,订阅事件,事件总线,他们的关系:


Android 开发之EventBus(2月4日 55%)_第1张图片
EventBus框架

EventBus用法也相当简单:

(http://www.cnblogs.com/xijin-wu/p/5293212.html)

着重看一下响应事件的四个函数:

onEvent: 

该事件在哪个线程发出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程(EventBus是如何做到的呢?)。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

onEventMainThread

不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行。这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

onEventBackground:

如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

onEventAsync:

无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

发送时发送的是这个类的实例,接收时参数就是这个类实例。

当发过来一个消息的时候,EventBus怎么知道要调哪个函数呢,就看哪个函数传进去的参数是这个类的实例,哪个是就调哪个。那如果有两个是呢,那两个都会被调用!!!!

三、源码解析

简单理解(猜测)EventBus的实现原理:

当我们使用EventBus.getDefault().register(this)将当前类注册到EventBus类时,EventBus会扫描当前类,把所有onEvent开头的方法记录下来。如何记录呢?使用Map,Key为方法的参数类型,Value中包含我们的方法。即,以键值对的方式被存储到EventBus中了。其中key是自定义的事件(Event.class),value是响应该事件的所有类(举例,A.class,B.class)。

当发送一个Event后,EventBus会根据post中实参(即Event)的类型,去Map中查找对应的方法,最终通过调用反射去执行我们的方法。


Android 开发之EventBus(2月4日 55%)_第2张图片
订阅者、发布者、EventBus 关系图


EventBus 负责存储订阅者、事件相关信息。订阅者和发布者都只和 EventBus 关联,他们不知道彼此的存在(这是EventBus的优点)。



Android 开发之EventBus(2月4日 55%)_第3张图片
事件响应流程

订阅者首先调用 EventBus 的 register 接口订阅某种类型的事件,当发布者通过 post 接口发布该类型的事件时,EventBus 执行调用者的事件响应函数。






参考:

Android 源码解析系列:

http://a.codekk.com/

EventBus源码地址:

https://github.com/greenrobot/EventBus

EventBus源码解析:

http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

张鸿洋 EventBus源码解析:

http://blog.csdn.net/lmj623565791/article/details/40794879

http://blog.csdn.net/lmj623565791/article/details/40920453


跨进程事件分发解决方案:

HermesEventBus-饿了么开源的Android跨进程事件分发框架:

http://lrd.ele.me/2016/07/13/HermesEventBus-%E4%B8%80%E7%A7%8D%E6%96%B0%E7%9A%84Android%E8%B7%A8%E8%BF%9B%E7%A8%8B%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%A1%86%E6%9E%B6/

你可能感兴趣的:(Android 开发之EventBus(2月4日 55%))