EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

EventBus 原理解析
EventBus官网
EventBus Github地址

EventBus的基本用法

  • 自定义一个事件类
  • 注册事件
  • 解除注册
  • 发送事件(普通事件、粘性事件)
  • 处理事件

自定义一个事件类

public class EventMsg<T> {private String msg;private int status;private T cls;public EventMsg(String msg, int status, T cls) {this.msg = msg;this.status = status;this.cls = cls;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public T getCls() {return cls;}public void setCls(T cls) {this.cls = cls;}@Overridepublic String toString() {return "EventMsg{" +"msg='" + msg + '\'' +", status=" + status +", cls=" + cls +'}';}
}

注册事件

@Override
protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册EventBus:getDefault()是一个单例方法,保证当前只有一个EventBus实例EventBus.getDefault().register(this);
}

解除注册

@Override
protected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);
}

发送事件

普通事件(post)

普通事件是先注册再绑定,就是在发送事件之后先订阅该事件才能收到该事件。

EventBus.getDefault().post(new EventMsg("欢迎来到EvenBus测试页面2", 1, this));

粘性事件(postSticky)

所谓粘性事件,就是在发送事件之后再订阅该事件也能收到该事件。
比如在项目中有这样的需求,在FirstActivity发送事件,到SecondActivity中做事件的处理。如果是使通过EventBus.getDefault.post(xx)发出的,在SecondActivity是接收不到消息的。 主要原因是SecondActivit用于接收消息的EventBus还未完成注册,也就是发布者发了消息,但订阅者还未产生。

EventBus.getDefault().postSticky(new EventMsg("欢迎来到EvenBus测试页面2", 0, this));

处理事件

普通事件

@Subscribe(threadMode = ThreadMode.MAIN)@Overridepublic void onEventMessage(EventMsg cls) {super.onEventMessage(cls);if (cls.getStatus() == 1)evenbusBinding.tv.setText(cls.getMsg());}

粘性事件

/*** threadMode:线程模式*       ThreadMode.POSTING,默认的线程模式,在那个线程发送事件就在对应线程处理事件,避免了线程切换,效率高。*       ThreadMode.MAIN,如在主线程(UI线程)发送事件,则直接在主线程处理事件;如果在子线程发送事件,则先将事件入队列,然后通过 Handler 切换到主线程,依次处理事件。*       ThreadMode.MAIN_ORDERED,无论在那个线程发送事件,都先将事件入队列,然后通过 Handler 切换到主线程,依次处理事件。*       ThreadMode.BACKGROUND,如果在主线程发送事件,则先将事件入队列,然后通过线程池依次处理事件;如果在子线程发送事件,则直接在发送事件的线程处理事件。*       ThreadMode.ASYNC,无论在那个线程发送事件,都将事件入队列,然后通过线程池处理。* sticky:是否支持粘性事件,默认为false*/@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)public void onEventMessage(EventMsg cls) {msg = cls.getMsg();}

Subscriber Index

EventBus 注册事件流程,主要是在项目运行时通过反射来查找订事件的方法信息,这也是默认的实现,如果项目中有大量的订阅事件的方法,必然会对项目运行时的性能产生影响。其实除了在项目运行时通过反射查找订阅事件的方法信息,EventBus 还提供了在项目编译时通过注解处理器查找订阅事件方法信息的方式,生成一个辅助的索引类来保存这些信息,这个索引类就是Subscriber Index,其实和 ButterKnife 的原理类似。
Subscriber Index 的核心就是项目编译时使用注解处理器生成保存事件订阅方法信息的索引类,然后项目运行时将索引类实例设置到 EventBus 中,这样当注册 EventBus 时,从索引类取出当前注册类对应的事件订阅方法信息,以完成最终的注册,避免了运行时反射处理的过程,所以在性能上会有质的提高。项目中可以根据实际的需求决定是否使用 Subscriber Index。
具体实现

EventBus简介与使用相关推荐

  1. Android 源码分析之 EventBus 的源码解析

    1.EventBus 的使用 1.1 EventBus 简介 EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus. ...

  2. Android EventBus 的使用

    1.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus.它简化了应用程序内各个组件之间进行通信的复杂度 ...

  3. Android EventBus 3.0.0 使用总结

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/53065112 本文出自[赵彦军的博客] 前言 EventBus框架 EventBu ...

  4. EventBus基础

    一.EventBus简介 # EventBus is a publish/subscribe event bus for Android and Java. # EventBus是一个事件发布/订阅框 ...

  5. 200代码写一套属于自己的事件总线(EventBus)库

    理论千万篇,不如实战来一篇. 源码 https://github.com/harvie1208/EventBus 关键词:观察者模式.反射.自定义注解.线程调度 手写200行代码,一步一步实现Even ...

  6. 安卓EventBus使用方法,eventbus举例

    原帖: 跳转 1.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus.它简化了应用程序内各个组件之间进 ...

  7. 安卓Android事件总线EventBus简单使用

    EventBus是的主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息,优点是开销小,代码更优雅.以及将发送者和接收者 ...

  8. Android - EventBus

    统计时间 2023.4.30 最后版本更新时间 2021.12.8 version 3.3.1 star 24.3k 1.EventBus 的使用场景 2.EventBus 和 BroadcastRe ...

  9. 事件总线框架EventBus的使用与原理解析

    文章目录 1. EventBus框架 1.1 EventBus简介 1.2 EventBus基本使用 1.2.1 添加Gradle依赖 1.2.2 定义事件 1.2.3 准备订阅者 1.2.4 发布事 ...

最新文章

  1. 首个卡车全栈自动驾驶系统发布:嬴彻轩辕!年内量产上路
  2. 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...
  3. CICS FILE OPEN
  4. 查看swintransformer的网络结构
  5. 动态载入树 (ASP+数据库)
  6. linux下IPROTO_TCP,TCP/IP协议栈在Linux内核中的运行时序分析
  7. spring依赖注入的基本方法及其原理
  8. java.lang.NumberFormatException: For input string:
  9. Ian Goodfellow等提出自注意力GAN,ImageNet图像合成获最优结果!
  10. DNS解析过程及工作原理
  11. 【阅读总结】Xen and the Art of Virtualization
  12. Java新手上路--算数运算符
  13. 嵌入式软件工程师_程序人生一名嵌入式软件工程师的成长总结
  14. 区间最值操作与历史最值问题(一)
  15. 教你通过windows的正版验证
  16. 如何把editplus设置成中文
  17. Windows访问共享报错 “不能访问此文件夹,因为你组织的安全策略.........”。
  18. 带你认识什么是BMS(电池管理系统)
  19. 几个常用的操作系统进程调度算法
  20. 联想erazert410_联想erazert410

热门文章

  1. 自动驾驶-自适应卡尔曼滤波AKF
  2. 举例说明协方差矩阵的运算
  3. 机器学习常用的五种预测结果评价
  4. mysql定时执行任务
  5. 树莓派3B+ 人脸识别(OpenCV)
  6. Idea Intellij 远程开发调试
  7. 虚拟机使用NAT模式搭建网络成功ping 通网络
  8. javascript TSP
  9. vue中的路由懒加载
  10. 每日一课 | Python处理文件系统的10种方法