Android基础 EventBus3 0实用教程
作为一个
Android
开发者,我们在日常的开发中肯定会使用到EventBus
,比如说当我们在做app
的消息模块的时候,接收到后台推送的消息之后,为了方便用户查看,就需要把消息保存到本地,正常情况下在页面上会有个badge
显示消息数量,如果我们不在badge
显示界面的话,就需要在接收到后台推送之后更新badge
上显示的消息数量,这个时候就可以使用EventBus
发出一个事件,这样订阅者接收到事件之后,就会从数据库拿未读消息数,显示在badge
上面。说了这么多,下面就简单的介绍下EventBus
的使用:
EventBus
地址:GitHub
一、EventBus 介绍
ventBus
是一个Android
端优化的publish/subscribe
消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。这个消息总线主要有三个部分:
- 事件(Event)
- 事件订阅者(Subscriber)(有没有想到
RxJava
里面的订阅者 ==。) - 事件发布者(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)
首先在所属的Activity
的onCreate()
里面注册
@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
有下面四种类型:
MAIN UI
主线程POSTING
默认调用方式,在调用post方法的线程执行,避免了线程切换,性能开销最少BACKGROUND
如果调用post
方法的线程不是主线程,则直接在该线程执行。 如果是主线程,则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,避免耗时操作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地址
你可以通过以下方式关注我:
- CSDN
- 掘金
- 个人博客
Android基础 EventBus3 0实用教程相关推荐
- Android基础入门视频培训教程-刘志远-专题视频课程
Android基础入门视频培训教程-146257人已学习 课程介绍 Android基础入门视频培训课程,该教程内容涵盖Android入门开发基本技能(环境搭建.Lineralayout ...
- Android笔记——Windows环境下Android Studio v1.0安装教程
本文主要讲解Windows环境下Android Studio的安装教程,Mac的Android Studio安装与此类似不在赘述,另外友情提示Windows下的SDK与Mac的SDK是通用的,可以直接 ...
- android sdk 5.0 安装教程,Android SDK 设置
Android SDK 设置 要在 Android 设备上构建并运行代码,首先必须遵循以下步骤.使用 Unity 或者从头开始编写 Android 应用程序均是如此. 1. 下载 Android SD ...
- 大学计算机基础实用教程重点知识,大学计算机基础实用操作教程
<高等学校计算机应用规划教材:大学计算机基础实用操作教程>紧抓基础操作,突出重点,遵循教学规律.对于计算机实际操作过程的细节不求面面俱到,但对其中典型的功能都做了比较详细的讲解.此外,&l ...
- Android studio 金丝雀,Android Studio 3.0
Android Studio 3.0金丝雀版于近日发布,由google官方推出的一款安卓集成环境开发软件,为用户提供了最新的android平台构建工具,新版本包括全新的应用性能分析工具.支持kotli ...
- android 菜鸟面单打印_1.0 Android基础入门教程
本教程于2015年7月开始撰写,耗时半年,总共148节,涵盖了Android基础入门的大部分知识,由于当时能力局限,虽已竭尽全力,但对于一些问题的分析难免有所纰漏,敬请读者海涵!IT技术更新换代很快, ...
- Android程序开发0基础教程(一)
程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统, ...
- Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰
Android基础新手教程--3.4 TouchListener PK OnTouchEvent + 多点触碰 标签(空格分隔): Android基础新手教程 本节引言: 如题,本节给大家带来的是To ...
- 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件
第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...
最新文章
- ICML 2021论文数据分析:谷歌第一,国内北大论文最多
- 导入旧版本Android项目时的“Unable to resolve target ‘android
- 面试官问我:spring、springboot、springcloud的区别,我笑了
- 用PHP代码实现简单的工厂模式,用PHP代码实现简单的工厂模式
- 安卓初学者必看实例,(手机GPS简单编程访问)
- 谁将引领新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
- arraylist内存溢出_ArrayList使用内存映射文件
- cygwin下的gcc-4.7.1编译心得
- esp8266电池供电方案_(普通照明、应急照明、事故照明)方案解读
- AI(adobe illustrator)怎么设置导出图片的像素尺寸
- Assembler如何把跳转汇编变成机器码的(一)
- vant 调取上传照片
- sklearn学习笔记(1)—make_blobs函数及参数
- wow(2) : UI插件_EUI[2]_正式服配置分享
- 正念的奇迹 - 喧嚣的世界中获取安宁
- 编码的奥秘:高级语言和低级语言
- 苹果客服:iPhone 12又一重磅升级确认!
- openMVS深度图计算:DenseReconstruction Estimate之EVTEstimateDepthMap之深度图初始化(patchmatch)
- 深度学习|卷积神经网络
- 0基础如何学习软件测试?