作为一个Android开发者,我们在日常的开发中肯定会使用到EventBus,比如说当我们在做app的消息模块的时候,接收到后台推送的消息之后,为了方便用户查看,就需要把消息保存到本地,正常情况下在页面上会有个badge显示消息数量,如果我们不在badge显示界面的话,就需要在接收到后台推送之后更新badge上显示的消息数量,这个时候就可以使用EventBus发出一个事件,这样订阅者接收到事件之后,就会从数据库拿未读消息数,显示在badge上面。说了这么多,下面就简单的介绍下EventBus的使用:

EventBus地址:GitHub

一、EventBus 介绍

ventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。这个消息总线主要有三个部分:

  1. 事件(Event)
  2. 事件订阅者(Subscriber)(有没有想到RxJava里面的订阅者 ==。)
  3. 事件发布者(Publisher)

官方的关系图:

特征叙述:

  • 简化组件间的通信

    • 事件发送者和接收者解耦
    • 在活动、片段和后台线程中执行良好
    • 避免了复杂、易出错的依赖关系和生命周期问题
  • 使你的代码更加简单
  • 快!
  • 小!(大约50K)
  • 在100,000,000+个程序上使用
  • 先进特征,比如指定线程、设置优先级等

二、使用EventBus仅需四步

1. 添加依赖

使用Gradle

compile 'org.greenrobot:eventbus:3.0.0'
复制代码

或者Maven

<dependency><groupId>org.greenrobot</groupId><artifactId>eventbus</artifactId><version>3.0.0</version>
</dependency>
复制代码

又或者下载Jar包添加到项目中 jar包下载

2. 定义事件(Event)

public class TestMsg {
}复制代码

这个TestMsg由从事件发布者发出,到事件订阅者接收,当然也可以加上额外的信息,比如下面可以传递name

public class TestMsg {private String name;public TestMsg(String name) {this.name = name;}public String getName() {return name;}
}
复制代码

3. 定义事件接收者(Subscriber)

首先在所属的ActivityonCreate()里面注册

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_lib);EventBus.getDefault().register(this);}
复制代码

onDestory里面取消注册

@Overrideprotected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);}
复制代码

然后定义处理事件:

@Subscribe(threadMode = ThreadMode.MAIN)public void onEventMainThread(TestMsg testMsg) {if (testMsg != null) {Log.d("MainActivity", "你收到的名字为: "+testMsg.getName());}}
复制代码

这里的定义了事件接收者以及使用注解@Subscribe(threadMode = ThreadMode.MAIN)指定了执行的线程。ThreadMode有下面四种类型:

  1. MAIN UI主线程

  2. POSTING 默认调用方式,在调用post方法的线程执行,避免了线程切换,性能开销最少

  3. BACKGROUND 如果调用post方法的线程不是主线程,则直接在该线程执行。 如果是主线程,则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,避免耗时操作

  4. ASYNC 开辟新独立线程,用来执行耗时操作,例如网络访问。

当然这里可以在注解里面设置优先级,比如下面设置优先级为100,越大就越线先接收到事件:

@Subscribe(threadMode = ThreadMode.POSTING,priority = 100)public void onEventMainThread(TestMsg testMsg) {if (testMsg != null) {Log.d("MainActivity", "你收到的名字为: "+testMsg.getName());}}
复制代码

如果你有三个接收事件,并且设置了不同的优先级,比如100、50、10,你也可以在priority = 100的接收到之后取消事件的传递,那么priority = 50和10的就不会接收到事件了。但是请注意,只能在ThreadMode.PostThread类型的才能取消,其他的三种ThreadMode类型是不能取消的。

如何设置:

EventBus.getDefault().cancelEventDelivery(event) ;
复制代码

4.定义事件发布者(Publisher)发出事件

sendMessage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EventBus.getDefault().post(new TestMsg("测试EventBus"));}});
复制代码

我写了一个小Demo,这个Demo是我在主module,也就是在app下面定义了事件接收者,在主app依赖的module下面发出事件来测试的。结果是可行的。有兴趣的小伙伴可以去看下:

Demo地址

你可以通过以下方式关注我:

  1. CSDN
  2. 掘金
  3. 个人博客

Android基础 EventBus3 0实用教程相关推荐

  1. Android基础入门视频培训教程-刘志远-专题视频课程

    Android基础入门视频培训教程-146257人已学习 课程介绍         Android基础入门视频培训课程,该教程内容涵盖Android入门开发基本技能(环境搭建.Lineralayout ...

  2. Android笔记——Windows环境下Android Studio v1.0安装教程

    本文主要讲解Windows环境下Android Studio的安装教程,Mac的Android Studio安装与此类似不在赘述,另外友情提示Windows下的SDK与Mac的SDK是通用的,可以直接 ...

  3. android sdk 5.0 安装教程,Android SDK 设置

    Android SDK 设置 要在 Android 设备上构建并运行代码,首先必须遵循以下步骤.使用 Unity 或者从头开始编写 Android 应用程序均是如此. 1. 下载 Android SD ...

  4. 大学计算机基础实用教程重点知识,大学计算机基础实用操作教程

    <高等学校计算机应用规划教材:大学计算机基础实用操作教程>紧抓基础操作,突出重点,遵循教学规律.对于计算机实际操作过程的细节不求面面俱到,但对其中典型的功能都做了比较详细的讲解.此外,&l ...

  5. Android studio 金丝雀,Android Studio 3.0

    Android Studio 3.0金丝雀版于近日发布,由google官方推出的一款安卓集成环境开发软件,为用户提供了最新的android平台构建工具,新版本包括全新的应用性能分析工具.支持kotli ...

  6. android 菜鸟面单打印_1.0 Android基础入门教程

    本教程于2015年7月开始撰写,耗时半年,总共148节,涵盖了Android基础入门的大部分知识,由于当时能力局限,虽已竭尽全力,但对于一些问题的分析难免有所纰漏,敬请读者海涵!IT技术更新换代很快, ...

  7. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统, ...

  8. Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰

    Android基础新手教程--3.4 TouchListener PK OnTouchEvent + 多点触碰 标签(空格分隔): Android基础新手教程 本节引言: 如题,本节给大家带来的是To ...

  9. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件

    第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...

最新文章

  1. ICML 2021论文数据分析:谷歌第一,国内北大论文最多
  2. 导入旧版本Android项目时的“Unable to resolve target ‘android
  3. 面试官问我:spring、springboot、springcloud的区别,我笑了
  4. 用PHP代码实现简单的工厂模式,用PHP代码实现简单的工厂模式
  5. 安卓初学者必看实例,(手机GPS简单编程访问)
  6. 谁将引领新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  7. arraylist内存溢出_ArrayList使用内存映射文件
  8. cygwin下的gcc-4.7.1编译心得
  9. esp8266电池供电方案_(普通照明、应急照明、事故照明)方案解读
  10. AI(adobe illustrator)怎么设置导出图片的像素尺寸
  11. Assembler如何把跳转汇编变成机器码的(一)
  12. vant 调取上传照片
  13. sklearn学习笔记(1)—make_blobs函数及参数
  14. wow(2) : UI插件_EUI[2]_正式服配置分享
  15. 正念的奇迹 - 喧嚣的世界中获取安宁
  16. 编码的奥秘:高级语言和低级语言
  17. 苹果客服:iPhone 12又一重磅升级确认!
  18. openMVS深度图计算:DenseReconstruction Estimate之EVTEstimateDepthMap之深度图初始化(patchmatch)
  19. 深度学习|卷积神经网络
  20. 0基础如何学习软件测试?

热门文章

  1. MySQL数据库自动添加时间戳
  2. 乘法运算-快速傅里叶变换
  3. HP-UNIX操作系统root账号被锁定的两种解决方法
  4. JMeter的PUT请求,响应结果中文出现乱码的解决方法
  5. 网上借鉴及自己对git的认知(很早就写了,一直没有上传,如有误解,请指出)...
  6. spring的controller是单例模式,但是是多线程,各个线程之间不影响
  7. Python自动化开发学习22-Django下(Form)
  8. 保持SVN仓库结构只checkout部分子目录
  9. Hadoop上路_11-HDFS流程演示
  10. 英特尔收购McAfee的10种结局猜测