【热门技术】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是一个通用的叫法 ...
随机推荐
- Travis CI用来持续集成你的项目
这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...
- MIP 官方发布 v1稳定版本
近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...
- Sublime的使用
1.一个可扩展性强的编辑工具 2.如何安装扩展 通过View->Show Console菜单打开命令行. 按图操作: 在控制台输入,然后回车: import urllib.request,os; ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- 基于RN开发的一款视频配音APP(开源)
在如今React.ng.vue三分天下的格局下,不得不让自己加快学习的脚步.虽然经常会陷入各种迷茫,学得越多会发现不会的东西也被无限放大,不过能用新的技术作出一些小项目小Demo还是会给自己些许自信与 ...
- [原] KVM 虚拟化原理探究(3)— CPU 虚拟化
KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...
- 基于NPOI的Excel数据导入
从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请 ...
- [转载]网站地址栏小图标favicon.ico的制作方法
有人也许会好奇,有的网址前面有个漂亮的小图标而且有的网站图标还会动,这是怎么做到的呢? 如下图所示: 那个小图标有个名字叫favicon.ico,网站图标虽小但可以起到很好的点缀作用,尤其是当浏览者将 ...
- BPM SharePoint解决方案分享
一.需求分析 SharePoint作为微软推出的协同类平台产品,为客户提供了门户.内容.文档.流程.社区.搜索.BI等一系列的解决方案,然而其流程功能由于设计理念差异,不能完全满足客户的需求,主要原因 ...
- mysql删除重复记录语句的方法
例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...