1、EventBus的作用

  EventBus is a publish/subscribe event bus for Android and Java.

  EventBus可以被用来在各种自定义的监听事件中使用,包括不限于Activity、Fragment、Service等等等等需要进行数据传递的地方,不过应该只局限于app内部。

2、EventBus的原理

  

  EventBus是一个典型的事件分发器,Observer模式。订阅者被集中到EventBus类中,当发布者通过post MessageEvent时,通知到订阅者。

3、EventBus的实现

  

    将订阅者注册到EventBus时,EventBus通过SubscriberMethodFinder反射扫描annotation @Subscribe,将注册者中的通知方法都存储在结构体中并返回给EventBus中的

subscriptionsByEventType结构体,这个结构体根据自定义的消息类型进行map存入,并且将该订阅者所有的自定义消息类型都放入结构体typesBySubscriber中。
    当发布自定义的消息时,EventBus从subscriptionsByEventType结构体中取出对应的消息method,invoke对应方法。

    当移除订阅者时,根据此订阅者检索typesBySubscriber,从subscriptionsByEventType结构体中移除所有该订阅者的方法。

4、EventBus的流程(此图看不清时请下载或者放大查看)

  

5、EventBus的使用

  5.1 定义订阅者需要传递的消息类型;对于不同的功能要定义不同的消息,同一个订阅者可以存在不同的消息类型;

  5.2 在订阅者中使用@Subscribe注解方法,方法一定要是public | (Modifier.ABSTRACT | Modifier.STATIC | BRIDGE | SYNTHETIC);

  5.3 将订阅者注册到EventBus,可以使用EventBus的builder方法或者EventBusBuilder进行EventBus的定制;

  5.4 post方法将自定义消息推送到订阅者;注意,由于在EventBus中使用了ThreadLocal的list,更好的支持多线程操作;而post时选择的最终消息推送线程,则由@Subscribe的注解方法中的参数ThreadMode决定;

  5.5 注意要在不使用时unregister订阅者;

  5.6 具体代码可参考EventBus github页面。 (https://github.com/greenrobot/EventBus)   

  1. Define events:

    public static class MessageEvent { /* Additional fields if needed */ }
  2. Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {/* Do something */};

    Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:

     @Override
    public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
    } @Override
    public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
    }
  3. Post events:

     EventBus.getDefault().post(new MessageEvent());
    
    that's ok.

EventBus总结(原)的更多相关文章

  1. EventBus使用详解(一)——初步使用EventBus

    一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间 ...

  2. EventBus源码解析

    用例 本文主要按照如下例子展开: //1. 新建bus对象,默认仅能在主线程上对消息进行调度 Bus bus = new Bus(); // maybe singleton //2. 新建类A(sub ...

  3. android EventBus详解(二)

    上一节讲了EventBus的使用方法和实现的原理,下面说一下EventBus的Poster只对粘滞事件和invokeSubscriber()方法是怎么发送的. Subscribe流程 我们继续来看Ev ...

  4. Rafy中的EventBus

    EventBus主要是干嘛使的,直接翻译叫事件总线. 是观察者模型的实现,利用它你既可以实现观察者模型的业务场景,还可以基于它的事件驱动机制来实现应用程序内组件之间的解耦与通信. 我们来看看有Even ...

  5. 基于.NetStandard的简易EventBus实现-基础实现

    一.问题背景 最近离职来到了一家新的公司,原先是在乙方工作,这回到了甲方,在这一个月中,发现目前的业务很大一部分是靠轮询实现的,例如:通过轮询判断数据处于B状态了,则轮询到数据后执行某种动作,这个其实 ...

  6. ABP vNext EventBus For RabbitMQ 分布式事件总线使用注意事项_补充官网文档

    [https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接) ...

  7. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  8. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

随机推荐

  1. IText PDF简单示例

    package com.exe.learn.demo.itextpdf; import java.io.ByteArrayInputStream; import java.io.File; impor ...

  2. 爬虫技术:cookies池的维护

    一:为什么要维护cookie 1.登录才能爬取内容 2.爬取频繁会被封号. 3.需要维护多个账号的cookie,实现大规模抓取 二:cookies的要求 1.自动登录更新 2.定期筛选验证 3.提供外 ...

  3. Testng的使用总结(内容待持续更新)

    testng 6.8使用多线程时,在pom的surefire插件始终无效 -->升级testng版本,在6.8版本中无任何提示的 如何调用自定义的报告的 -->在testng中,有个IRe ...

  4. vue 项目的运行与 打包

    1.vue init webpack 2.npm install axios 3.npm run dev  运行项目 4.npm run build 打包项目 会生成一个dist 文件夹,我们只需要把 ...

  5. 第二周作业—N42-虚怀若谷

    一.描述Linux发行版的系统目录名称命名规则以及用途 1.文件名命名规则 (1).文件名最长255字节 (2).包括路径在内的文件名称最长4095个字节 (3).除了斜扛和NUL,所有字符都有效.但 ...

  6. jenkins部署github项目持续集成

    一.先介绍正向代理和反向代理 正向代理 反向代理 二.安装反响代理得到固定域名 http://www.xiaomiqiu.cn/ 三.Jenkins与Github集成 配置前要求: 1.Jenkins ...

  7. 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!

    <阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单元测试规约.异常日志规约.MySQL规约.工程规约.安全规约等,这是近万名阿里Java技术精英的经验总 ...

  8. [CF1149E]Election Promises

    可以猜想这题和sg函数有关.(反正也没有什么其它可用的算法) 因为是个DAG,所以可以先求出每个点的sg值.考虑怎样求答案. 根据sg函数证明的思路,我们可以考虑构造一个权值,使得以下三个条件满足: ...

  9. Win7隐藏登录界面中的用户(不建议HOME版使用)

    一天一點 能登多高,靠的不是双脚!能看多远,靠的不是双眼!人生路,贵在坚持! Win7隐藏登录界面中的用户(不建议HOME版使用) Win7中如何隐藏不想出现在登录界面中的用户 在Windows系统管 ...

  10. Cent OS (二)常用的命令介绍

    1. 常用的Linux命令   序号 命令 对应英文 作用 01 ls list 查看当前文件夹下的内容 02 pwd print work directory 查看当前所在的文件夹 03 cd [目 ...