【热门技术】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是一个通用的叫法 ...
随机推荐
- 【趣事】用 JavaScript 对抗 DDOS 攻击
继续趣事分享. 上回聊到了大学里用一根网线发起攻击,今天接着往后讲. 不过这次讲的正好相反 -- 不是攻击,而是防御.一个奇葩防火墙的开发经历. 第二学期大家都带了电脑,于是可以用更高端的方法断网了. ...
- 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直 ...
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验
运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...
- InnoDB关键特性学习笔记
插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- 来吧,HTML5之基础标签(下)
<dialog> 标签 定义对话框或窗口. <dialog> 标签是 HTML 5 的新标签.目前只有 Chrome 和 Safari 6 支持 <dialog> ...
- 玩转spring boot——AOP与表单验证
AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...
- Android Studio快捷键
一.android studio 默认快捷键 刚开始接触一款开发软件,想必很想了解它的快捷方式,这会对你的编程起到很好的帮助,提高工作效率,接下来给你介绍下Android Studio一些常用的快 ...
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...