美文网首页
Android 开发之EventBus(2月4日 55%)

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

作者: LiveMoment | 来源:发表于2017-02-06 09:37 被阅读62次

    一、简介:

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

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

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

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

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

    二、基本用法

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

    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中查找对应的方法,最终通过调用反射去执行我们的方法。

    订阅者、发布者、EventBus 关系图

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

    事件响应流程

    订阅者首先调用 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%)

          本文链接:https://www.haomeiwen.com/subject/twgqlttx.html