【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
2016-11-22 16:15
344 查看
一、写在前面
还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?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、添加依赖
2、编写事件类,这里可以传递任意类型,先来传递一个Object类吧
User类很简单
3、post发送事件(这里我是使用三个Activity,布局只有简单的Button和TextView,具体代码可上github查看)
4、订阅者接收事件
三、注意事项
1、注册一般写在onCreate或者onStart中,尽量不要写在onResume,可能出现多次注册,比如:
EventBusException: Subscriber class already registered to event class
2、取消注册一定写在onDestory,写在onStop可能会引发异常;
3、建议注册前先判断一下是否已经注册,避免重复注册,并且注册尽量放在各变量初始化最后,以免造成空指针异常;
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,专注于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
相关文章推荐
- Android:EventBus的使用 从此消息传递变得简单
- EventBus 的使用,发布,订阅消息的传递。第三方开源库
- 事件总线 EventBus 3.0 简单运用
- Android- 创建一个简单的事件订阅组件(一)
- 传递消息--第三方开源--EventBus的简单使用
- 一种简单的消息和事件传递模型
- EventBus的简单使用,消息传递
- Android组件间通信机解耦——Android EventBus和Otto框架一、前言 传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之
- 传递消息--第三方开源--EventBus的简单使用
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC六大关键技术之(五)(六)——消息映射与命令传递
- TDataGridViewEx组件中设置单元格只读(ReadOnly)的.NET事件实现技术
- 学习CEGUI亟待解决问题二:消息事件传递机制问题
- FLEX实践: 组件传递事件的处理
- ★★★【庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术系列—(5)事件和数据回发机制】★★★
- 基于事件的监听,消息订阅设计模式的实现框架,ERP,OA,复杂,灵活多变的项目的福音
- 事件的本质——对消息传递的封装
- 委托与事件的简单应用(不同控件之间的控制及参数传递,C# VB)
- Silverlight制作一个简单的菜单1-用到的知识讲解 xml数据读取,事件如何传递参数
- 一、从简单MXML组件中处理事件