zoukankan      html  css  js  c++  java
  • AndroidEventBus ( 事件总线 ) 的设计与实现

    1. 功能介绍

    AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity、Fragment、Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦合。使得我们的代码更加简洁,耦合性更低,提升我们的代码质量。

    AndroidEventBus吸收了greenrobot的EventBus以及square的otto的长处,并在此基础上做出了相应的改进,使得事件总线框架更适合用户的使用习惯,也使得事件的投递更加的精准、灵活。

    与EventBus、otto的差别

    名称 订阅函数是否可运行在其它线程 特点
    greenrobot的EventBus 使用name pattern模式,效率高,但使用不方便。

    square的otto 使用注解,使用方便,但效率比不了EventBus。
    AndroidEventBus 使用注解。使用方便。但效率比不上EventBus。

    订阅函数支持tag(相似广播接收器的Action)使得事件的投递更加准确。能适应很多其它使用场景。

    很多其它细节请參考AndroidEventBusAndroid事件总线 ( AndroidEventBus ) 开源库公布

    2. 整体设计

    arch

    AndroidEventBus简约整体设计大致如上图所看到的,主要分为三个部分。即EventBus、SubscriberMethodHunter、EventHandler。

    EventBus负责订阅对象与事件的管理,比方注冊、注销以及公布事件等。

    在初始时将某个对象注冊到EventBus中,EventBus会遍历该对象class中的全部方法,把參数数量为1且用了Subscriber注解标识的函数管理起来,以事件类型和订阅函数Subscriber的tag构建一个EventType作为一种事件类型,某个事件类型相应有一个接收者列表。当有事件公布时,EventBus会依据公布的事件类型与tag构建EventType,然后找到相应的订阅者列表,而且将这些事件投递给全部订阅者。SubscriberMethodHunter负责查找合适的EventType,而EventHandler则负责将这些订阅函数运行到相应的线程中。至此,整个事件总线的操作流程就完毕了,当然在将Activity、Fragment等组件注冊到EventBus时,不要忘了在这些对象销毁时将它们从EventBus中移除,即调用unregister方法。

    3. 流程图

    注冊接收者简单流程图

    flow

    公布事件简单流程图

    flow

    4. 具体设计

    4.1 核心类具体介绍

    • EventBus : 事件总线核心类,封装了订阅对象的注冊、注销以及事件的公布、投递等,是事件总线最核心的类;
    • EventType : 事件类型对象,由事件Class类型与接收函数tag组成。用于标识一个事件类型;
    • Subscriber : Subscriber注解,作用于函数上。用于标识这个函数是一个事件订阅函数;
    • ThreadMode : 接收函数的运行线程模型,默认运行在UI线程;
    • Subscription : 一个订阅对象的封装类,含有接收对象、目标方法、线程模型;
    • TargetMethod : 目标订阅方法;
    • SubsciberMethodHunter : 订阅方法查找辅助类,依据事件对象查找符合要求的EventType列表。EventBus依据这个返回的列表来投递事件给订阅者;
    • EventHandler : 事件处理器;
    • DefaultEventHandler : 默认的事件处理器,即事件在哪个线程投递,则处理事件也在该线程;
    • UIThreadEventHandler : 事件处理在UI线程的Handler;
    • AsyncEventHandler : 事件处理在一个独立线程的Handler;
    • MatchPolicy : 事件匹配策略接口;
    • DefaultMatchPolicy : 默认的匹配策略,公布事件时,EventBus会查找參数是该事件父类的函数,而且构造相应的EventType;
    • StrictMatchPolicy : 严格的匹配策略。公布事件时仅仅查找參数类型全然匹配的订阅函数;

    4.2 类关系图

    uml

    5. 杂谈

    事件总线的基本结构和设计都是相似的,仅仅是大家在各种feature之间做了取舍或者增强了某些功能,使之可以满足用户的具体需求。几个事件总线库的基本特点在章节1中已经粗略给出。大家可以依据自己的需求进行选择。

    本篇文章我们对AndroidEventBus做了一个简单介绍。在兴许的文章中我们再进行具体介绍,敬请期待。

  • 相关阅读:
    Vue 中样式穿透 /deep/
    Vue 数据冻结 Object.freeze
    Vue 启动项目内存溢出
    Typora[ markdown ] 使用3之----- 语法高亮显示
    Typora[ markdown ] 使用2之-----空格显示
    手动创建mysql数据库的语句记录
    api不能自动注入条件的解决方法
    【WTM框架】查询列表显示正常,但是导出的时候查询条件不起作用的问题记录及解决方法
    WTM问题之“数据列表”控件出现横向的滚动条的解决方法
    树莓派docker无法限制内存Your kernel does not support memory limit capabilities or the cgroup is not mounted
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5341234.html
Copyright © 2011-2022 走看看