关于EventBus3.0使用,你看这篇就够了
作为一枚Android开发者,关于EventBus相信应该都听说过。要是用过就请忽略本文,本文讲得比较基础。
要是没用过,建议你花两分钟看看。
目前EventBus最新版本是3.0,本demo基于3.0编写的。
GitHub : https://github.com/greenrobot/EventBus
官方文档:http://greenrobot.org/eventbus/documentation
一、EventBus概述
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。
作为一个消息总线主要有三个组成部分:
- 事件(Event)
- 事件订阅者(Subscriber)
事件发布者(Publisher)
官方提供的关系图
二、EventBus用法
1、把EventBus依赖到项目
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
Maven
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.0.0</version>
</dependency>
或者直接下载EventBus 架包jar 放到项目中
2、构造发送消息类,也就是发送的对象
public class MainMessage{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3、注册/解除注册
EventBus.getDefault().register(this);//注册
EventBus.getDefault().unregister(this);//解除注册
4 、发送消息
EventBus.getDefault().post(new MainMessage("你好,爱开发");
ThreadMode总共四个:
MAIN UI主线程
POSTING 默认调用方式,在调用post方法的线程执行,避免了线程切换,性能开销最少
BACKGROUND 如果调用post方法的线程不是主线程,则直接在该线程执行。
如果是主线程,则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,避免耗时操作ASYNC 开辟新独立线程,用来执行耗时操作,例如网络访问。
来看一下源码,ThreadMode也就一个枚举,英文自己对照理解吧,不是很复杂
public enum ThreadMode {
/**
* Subscriber will be called in the same thread, which is posting the event. This is the default. Event delivery
* implies the least overhead because it avoids thread switching completely. Thus this is the recommended mode for
* simple tasks that are known to complete is a very short time without requiring the main thread. Event handlers
* using this mode must return quickly to avoid blocking the posting thread, which may be the main thread.
*/
POSTING,
/**
* Subscriber will be called in Android's main thread (sometimes referred to as UI thread). If the posting thread is
* the main thread, event handler methods will be called directly. Event handlers using this mode must return
* quickly to avoid blocking the main thread.
*/
MAIN,
/**
* Subscriber will be called in a background thread. If posting thread is not the main thread, event handler methods
* will be called directly in the posting thread. If the posting thread is the main thread, EventBus uses a single
* background thread, that will deliver all its events sequentially. Event handlers using this mode should try to
* return quickly to avoid blocking the background thread.
*/
BACKGROUND,
/**
* Event handler methods are called in a separate thread. This is always independent from the posting thread and the
* main thread. Posting events never wait for event handler methods using this mode. Event handler methods should
* use this mode if their execution might take some time, e.g. for network access. Avoid triggering a large number
* of long running asynchronous handler methods at the same time to limit the number of concurrent threads. EventBus
* uses a thread pool to efficiently reuse threads from completed asynchronous event handler notifications.
*/
ASYNC
}
5 、事件处理
//ui主线程中执行
@Subscribe(threadMode = ThreadMode.Main)
public void onMainEventBus(MainMessage msg) {
}
6、priority事件优先级
//priority越大,级别越高
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void onEvent(MainMessage event) {
}
7、终止事件传递
// 注意中止事件传递,后续事件不在调用
@Subscribe
public void onEvent(MessageEvent event){
EventBus.getDefault().cancelEventDelivery(event) ;
}
下面我们来看一个完整的demo
先看一下效果图:

新建两个activity,分别为MainActivity和 SecondActivity
其中MainActivity来放了五个按钮和一个文本框
SecondActivity只有一个按钮,点击按钮通知MainActivity页面更新。
看一下MainActivity主要代码:
/**
* 主线程中执行
*
* @param msg
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainEventBus(MainMessage msg) {
Log.e(TAG, msg.getMessage());
tv_desc.setText(msg.getMessage());
}
/**
* 后台线程
*
* @param msg
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackgroundEventBus(BackgroundMessage msg) {
Log.e(TAG, msg.getMessage());
}
/**
* 异步线程
*
* @param msg
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsyncEventBus(AsyncMessage msg) {
Log.e(TAG, msg.getMessage());
}
/**
* 默认情况,和发送事件在同一个线程
*
* @param msg
*/
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostEventBus(PostingMessage msg) {
Log.e(TAG, msg.getMessage());
}
按钮点击事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnMain:
EventBus.getDefault().post(new MainMessage("MainMessage"));
break;
case R.id.btnBackground:
EventBus.getDefault().post(new BackgroundMessage("BackgroundMessage"));
break;
case R.id.btnAsync:
EventBus.getDefault().post(new AsyncMessage("AsyncMessage"));
break;
case R.id.btnPosting:
EventBus.getDefault().post(new PostingMessage("PostingMessage"));
break;
case R.id.btn1:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
break;
}
}
分别点击前面四个按钮时控制台按顺序输出:

SecondActivity页面点击发送消息的事件
EventBus.getDefault().post(new MainMessage("传递信息:aikaifa"));
在MianActivity页面我们就能接受到SecondActivity传递过来的信息了。
如果感兴趣想跑一下项目,源码请戳这里
作者:洪生鹏
链接:https://www.jianshu.com/p/f9aabe9d4eca
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
关于EventBus3.0使用,你看这篇就够了的更多相关文章
- 【HTTP】402- 深入理解http2.0协议,看这篇就够了!
本文字数:3825字 预计阅读时间:20分钟 导读 http2.0是一种安全高效的下一代http传输协议.安全是因为http2.0建立在https协议的基础上,高效是因为它是通过二进制分帧来进行数据传 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
- [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
- Vue学习看这篇就够
Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- React入门看这篇就够了
摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所有. React 背景介绍 React 入门实例教程 React 起源于 ...
- [转帖]Zookeeper入门看这篇就够了
Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...
随机推荐
- Django开发流程
1.创建Django工程 django-admin startproject pro1 2.settings.py配置中文和时区,和在pro1根目录下创建一个'static'目录,并在settings ...
- python3连接外部Mysql
前提条件,已经安装过MySQL(比如说以前web开发安装过MySQL) 1.安装PyMySQL pip install PyMySQL 2.测试 import pymysql as ps db = p ...
- ES6通过WeakMap解决内存泄漏问题
一.Map 1.定义 Map对象保存键值对,类似于数据结构字典:与传统上的对象只能用字符串当键不同,Map对象可以使用任意值当键. 2.语法 new Map([iterable]) 属性 size:返 ...
- Qt隐式共享与显式共享
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/69945878Qt中的很多C++类都使用了隐式数据共 ...
- Learning How to Learn学习笔记(转)
add by zhj: 工作中提高自己水平的最重要的一点是——快速的学习能力.这篇文章就是探讨这个问题的,掌握了快速学习能力的规律,你自然就有了快速学习能力了. 原文:Learning How to ...
- (转)专项:Android 内存泄露实践分析
今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ; 原文链接:https://teste ...
- 用Maven构建Mahout项目实现协同过滤userCF--单机版
本文来自:http://blog.fens.me/hadoop-mahout-maven-eclipse/ 前言 基于Hadoop的项目,不管是MapReduce开发,还是Mahout的开发都是在一个 ...
- Linux查看系统信息及系统性能检测命令
查看系统信息: ~# uname -a (Linux查看版本当前操作系统内核信息)Linux iZ23onhpqvwZ 3.13.0-30-generic #54-Ubuntu SMP Mon Jun ...
- T25健身视频全集+课表
http://jianfei.39.net/thread-3639251-1.html T25健身视频全集+课表 强度适中 不伤膝盖! [复制链接] zytttt 主题 好友 ...
- Python:virtualenv介绍
virtualenv 在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时 ...
