【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
一、写在前面
还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布、订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handler,BroadCast,接口等传统方案。这么优雅的功能实现,却只有50k左右的jar包,无疑集快、小、优雅解耦于一身,目前最新版本为3.0,与之前版本有所冲突,官方网址:https://github.com/greenrobot/EventBus
二、使用简介
总的流程只需要4步:添加依赖=>编写事件类=>发送事件=>接收事件并处理。
通过一个例子说明:例子为三个Activity,入口Activity点击一个Button跳转到第二个Activity,第二个Activity点击跳转第三个,第三个可以发送数据让第一个Activity接收,具体可看下面的gif图,代码详见github:https://github.com/nanchen2251/EventbusDemo

1、添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
2、编写事件类,这里可以传递任意类型,先来传递一个Object类吧
package com.nanchen.ischool.eventbusdemo; /**
* @author nanchen
* @fileName EventBusDemo
* @packageName com.nanchen.ischool.eventbusdemo
* @date 2016/11/22 15:42
*/ public class MessageEvent {
private User mUser; public MessageEvent(User user) {
mUser = user;
} public User getUser() {
return mUser;
} public void setUser(User user) {
mUser = user;
}
}
User类很简单
package com.nanchen.ischool.eventbusdemo; /**
* @author nanchen
* @fileName EventBusDemo
* @packageName com.nanchen.ischool.eventbusdemo
* @date 2016/11/22 15:42
*/ public class User {
private String username;
private String password; public User(String username, String password) {
this.username = username;
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}
3、post发送事件(这里我是使用三个Activity,布局只有简单的Button和TextView,具体代码可上github查看)
package com.nanchen.ischool.eventbusdemo; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; import org.greenrobot.eventbus.EventBus; public class Main3Activity extends AppCompatActivity { private EditText mEditUsername;
private EditText mEditPwd; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
mEditUsername = (EditText) findViewById(R.id.edit_username);
mEditPwd = (EditText) findViewById(R.id.edit_pwd);
} public void btnClick3(View view) {
String username = mEditUsername.getText().toString().trim();
String password = mEditPwd.getText().toString().trim();
EventBus.getDefault().post(new MessageEvent(new User(username,password)));
finish();
}
}
4、订阅者接收事件
package com.nanchen.ischool.eventbusdemo; import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode; public class MainActivity extends AppCompatActivity { private TextView mTextView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.text); if (!EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().register(this);
}
} public void btnClick(View view) {
startActivity(new Intent(this,Main2Activity.class));
} @Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent event) {
if (event.getUser() != null){
mTextView.setText("用户名:"+event.getUser().getUsername()
+",密码:"+event.getUser().getPassword());
}
} @Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
三、注意事项
1、注册一般写在onCreate或者onStart中,尽量不要写在onResume,可能出现多次注册,比如:
EventBusException: Subscriber class already registered to event class
2、取消注册一定写在onDestory,写在onStop可能会引发异常;
3、建议注册前先判断一下是否已经注册,避免重复注册,并且注册尽量放在各变量初始化最后,以免造成空指针异常;
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
4、3.0和之前版本不兼容,现在采用注解的方法来接收事件,四种注解方式分别为:
1) @Subscrible 对应之前的onEvent();
2) @Subscrible(threadMode = ThreadMode.ASYNC) 对应之前的onEventAsync();
3) @Subscrible(threadMode = ThreadMode.BACKGRAND) 对应之前的onEventBackground();
4) @Subscrible(threadMode = ThreadMode.MAIN) 对应之前的onEventMainThread();
5、采用注解后方法名没有限制了,参数只有一个,和发送者post的参数对应配对,未声明threadMode的时候默认线程模式是ThreadMode.POSTING,只有在该模式下才可以取消线程,否则容易导致如下异常:org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
6、一个事件不支持重复注册,否则会报异常。
四、写在最后
有不理解的请在评论区留言,博主一向都是直播模式对待每一篇博客,如果你喜欢,点个推荐吧~转载请附带本文链接:http://www.cnblogs.com/liushilin/p/6089785.html
【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~的更多相关文章
- 封装事件订阅来进行非父子组件的传值(React)
const list={} // 将事件名和事件函数装进事件池里 function $on(name,func) { if(!name || !func) return; if(!Object.key ...
- APICloud数据云3.0 -- 让后端业务更简单
近年来,各类移动端应用层出不穷,app.小程序已成为企业业务数字化的必然选择,围绕互联网产品的技术创新与开发者生态,正在历经行业发展的又一次革新. APICloud作为国内领先的移动应用开发平台,一直 ...
- seldom 2.0 让接口自动化测试更简单
前言 HTTP接口测试很简单,不管工具.框架.还是平台,只要很的好的几个点就是好工具. 测试数据问题:比如删除接口,重复执行还能保持结果一致,必定要做数据初始化. 接口依赖问题:B接口依赖A的返回值, ...
- Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式
大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,总结和整理以前的项目经验,动手写了个洋葱架构(整洁架构)示例解决方案 OnionArch.其目的是为了更好的实现基于DDD(领域驱动分析) ...
- 玩转 .NET Core 3.0:逐浪CMS新版发布,建站更简单、网站更安全
2019年11月11日,在大家都忙于网上体会“双11 ”的热闹气氛的时候,逐浪CMS开发者团队正在做着新版本发布的最后工作.此次更新是基本于 .NET Core 3.0开发,也是全国首个基于 .NET ...
- Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线
Go beyond yourself rather than beyond others. 上篇文章 深入理解 EventBus 3.0 之使用篇 我们了解了 EventBus 的特性以及如何使用,这 ...
- Android 框架学习1:EventBus 3.0 的特点与如何使用
前面总结了几篇基础,在这过程中看着别人分享自定义 View.架构或者源码分析,看起来比我写的"高大上"多了,内心也有点小波动. 但是自己的水平自己清楚,基础不扎实画再多源码流程图也 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
- Android EventBus 3.0.0 使用总结
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6039221.html 本文出自[赵彦军的博客] 前言 EventBus框架 EventBus是一个通用的叫法 ...
随机推荐
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 【Net跨平台第一步】逆天带你零基础Linux入门【更新完毕】
部分讲义:(视频已删,后期以文档形式发布)
- JavaScript function函数种类
本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...
- video.js
1.github地址 2.常用API: class : video-js: video-js应用视频所需的风格.js功能,比如全屏和字幕. vjs-default-skin: vjs-default- ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 原生js+css3实现图片自动切换,图片轮播
运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...
- vscode 1.5安装体验
1.下载安装 官方下载地址: http://code.visualstudio.com/ 界面截图: 2.图标显示功能File Icon Themes vscode1.5版本文件夹视图,可显示文件类型 ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...