一、EventBus介绍
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。传统的事件传递方式包括:Handler、BroadcastReceiver、Interface回调,相比之下EventBus的优点是代码简洁,使用简单,并将事件发布和 订阅充分解耦。

二、使用场景
刚开始接触EventBus的使用,感觉EventBus既然这么强大,可以快捷方便的进行各组件之间的消息传递,那是不是就完全可以取代Intent、BroadcastReceiver、Handler等方式了。后来查了许多资料发现其实不是的,它也有很多限制。

1、Event会根据传递的参数给所有接收者都传递消息,这就导致如果你想给指定一个类里发布消息就得自己写一个接口类,要不然就会好多执行者都会执行该方法,所以一般能用Intent组件传值时还是用Intent。

2、EventBus相对于BroadCast,广播是相对消耗时间、空间最多的一种方式,但是大家都知道,广播是四大组件之一,许多系统级的事件都是通过广播来通知的,比如说网络的变化、电量的变化,短信发送和接收的状态,所以,如果与android系统进行相关的通知,还是要选择本地广播;在BroadcastReceiver的 onReceive方法中,可以获得Context 、intent参数,这两个参数可以调用许多的sdk中的方法,而eventbus获得这两个参数相对比较困难。

3、EventBus相对于handler,可以实现handler的方式,但是也会面对有许多接收者的问题,所以如果是线程回调的话,我觉得还是用handler比较好。

4、使用场景总结:所以EventBus最好的使用方式就是替代某些BroadcastReceiver和Interface;如fragment之间进行通信,用广播和接口都比较麻烦,而用EventBus则比较简单。

三、具体使用方法
1、EventBus的四种线程模型(ThreadMode)
POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起应用程序无响应(ANR)。
MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

2、基本使用
自定义一个事件类

public class AnyEventType {public AnyEventType(){}}

在要接受消息的页面注册

EventBus.getDefault().register(this);

接收消息的方法

@Subscribe
public void onEvent(AnyEventType event) {/* Do something */};

发送消息

EventBus.getDefault().post(event);

取消注册

EventBus.getDefault().unregister(this);

传递的值可自定义class,也可传递字符串,EventBus会根据传递的类型判断都有哪些接收者接收,如果有多个方法,则传递给所有接收者。

3、粘性事件 
    之前说的使用方法,都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。 
   普通的事件我们通过post发送给EventBus,发送过后之后当前已经订阅过的方法可以收到。但是如果有些事件需要所有订阅了该事件的方法都能执行呢?例如一个Activity,要求它管理的所有Fragment都能执行某一个事件,但是当前我只初始化了3个Fragment,如果这时候通过post发送了事件,那么当前的3个Fragment当然能收到。但是这个时候又初始化了2个Fragment,那么我必须重新发送事件,这两个Fragment才能执行到订阅方法。 
   粘性事件就是为了解决这个问题,通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。

构造发送信息类:

public class StickyEvent {public String msg;public StickyEvent(String msg) {this.msg = msg;}
}

发布消息:EventBus.getDefault().postSticky(new StickyEvent(“我是粘性事件”));
接收消息:和之前的方法一样,只是多了一个 sticky = true 的属性。

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(StickyEvent event){tv_c_result.setText(event.msg);
}
1
2
3
4

注册:

EventBus.getDefault().register(CActivity.this);

1

解注册:

EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(CActivity.class);

EventBus使用总结和使用场景相关推荐

  1. java actor akka_Actor 模型及Akka简介

    Actor 模型 Actor 的基础就是消息传递,一个 Actor 可以认为是一个基本的计算单元,它能接收消息并基于其执行运算,它也可以发送消息给其他 Actor.Actors 之间相互隔离,它们之间 ...

  2. Actor 模型及Akka简介

    Actor 模型 Actor 的基础就是消息传递,一个 Actor 可以认为是一个基本的计算单元,它能接收消息并基于其执行运算,它也可以发送消息给其他 Actor.Actors 之间相互隔离,它们之间 ...

  3. 翟佳:高可用、强一致、低延迟——BookKeeper的存储实现

    分享嘉宾:翟佳 StreamNative 联合创始人 编辑整理:张晓伟 美团点评 出品平台:DataFunTalk 导读:多数读者们了解BookKeeper是通过Pulsar,实际上BookKeepe ...

  4. 博文推荐|BookKeeper - Apache Pulsar 高可用 / 强一致 / 低延迟的存储实现

    本文转自:DataFunTalk,分享嘉宾:翟佳,StreamNative 联合创始人 编辑整理:张晓伟 美团点评 导读:多数读者们了解 BookKeeper 是通过 Pulsar,实际上 BookK ...

  5. 2020面试美团的朋友看过来,牛客网搜集整理2018—2020美团面筋需要的自行领取

    美团一面: 自我介绍 学校课程 计网:OSI七层模型 应用层协议了解多少 DNS和Http在什么层 TCP.UDP区别 一般在什么层操作 学校学过的语言 Java三大特性 怎么体现多态 private ...

  6. 【设计模式】观察者模式:一个注册功能也能使用到设计模式?

    人生在世如身处荆棘之中,心不动,人不妄动,不动则不伤,如心动则人妄动,伤其身,痛其骨,于是体会到世间诸般痛苦 目录 我的斗罗梦 悲催的小明 什么是观察者模式? 注册功能改造 异步非阻塞观察者模式 Ev ...

  7. EventBus如何使用及一些常见场景

    目前网上有很多的eventbus的教程,本身eventbus使用也比较简单,也没有难以理解的地方,所以我就不多提入门教程了.讲几个场景,使用eventbus后可以使项目更简单,便于快速开发功能. 至于 ...

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

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

  9. Android各组件/控件间通信利器之EventBus

    实际项目开发过程中,经常遇到如下场景:不同的应用程序组件的控件间具有一定的相 互关联性,其中用户对后者进行的某种操作会引起前者的相应改变.举一个具体的场景:以糗事百科为例,在糗事列表页和详情页页,对于 ...

最新文章

  1. 基于javaGUI的文档识别工具制作
  2. 在vc6控制台程序中如何调用运行ImageMagick命令行工具
  3. jquery通过ajax向后台发送(checkbox)数组,并在后台接收,(发送的数据是checkedbox)...
  4. 《面向对象的思考过程(原书第4版)》一1.11 组合
  5. HDU嵌入式实验课程大作业分析报告
  6. ubuntu下安装psycopg2报错
  7. 【hortonworks/registry】registry 如何添加新的类型 支持 json
  8. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
  9. Android Studio禁止混淆JNI代码
  10. 关于HTML(十)-------怎么提升网站页面打开加载速度优化
  11. Ivy Bridge处理器
  12. Bongiovi DPS for Mac - 优秀的声音增强软件
  13. C/C++——黑客数字雨特效
  14. 南方cass提取坐标生成表格_如何利用EXCEL随机生成测量点坐标导入南方CASS中计算土方量...
  15. 电流转电压的multisim仿真电路图
  16. python输入按逗号分开_python print 按逗号或空格分隔的方法
  17. c语言字符串删除元音字母,C语言:写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出...
  18. android apk 微信登入_微信第三方登录(Android 实现)
  19. springboot班级同学录网站
  20. Angular7入门辅助教程(一)——Angular模块

热门文章

  1. 我不是机器人:谷歌最新版验证码系统ReCaptcha破解已开源
  2. MediaCodec之H264编码
  3. 在Windows 10上将C语言程序转成16位8086汇编代码
  4. C语言基础 — 运算符
  5. Unity 多物体混合动画、值变动画控制器
  6. 浅谈程序员创业的三年血雨腥风(励志之作)
  7. 2022青海最新起重机指挥模拟考试试题及答案
  8. 如何给Excel添加用户自定义的公式
  9. 记录QQ群管理页面无法正常打开的问题
  10. 开发者必备工具,一键生成接口文档、调用示例