Android Event bus 消息/事件通信框架介绍和应用,以及与handle message和broadcastreceiver之间的比较
来源:互联网 发布:泗阳12345网络问政 编辑:程序博客网 时间:2024/05/16 10:12
Android Event bus 消息/事件通信框架介绍和应用,以及与handle message和broadcastreceiver之间的比较
Android 开发时经常会用到线程间(或不同类之间)的消息交互,通常会采用handle message、broadcastreceiver的机制实现通信,这里将介绍一种新的消息交互方式event bus。
一、概述
Event bus是一款针对Android优化的事件发布/订阅框架,快速且轻量,是 github 的明星项目之一。
其优点是发送者和接收者解耦,且代码简洁,使用简单,是当前流行的消息传递框架。
代替了handler,broadcastreceiver,interface回调在Fragment,Activity,Service,线程之间传递消息。
1、下载EventBus的地址
源码:https://github.com/greenrobot/EventBus
2、基本使用
(1)自定义一个类:
public class MessageEvent { private final String message; public MessageEvent(String message) { this.message = message; } public String getMessage() { return message; }}
(2)在要接收消息的页面注册:
EventBus.getDefault().register(this);
(3)发送消息
EventBus.getDefault().post(new MessageEvent("hello message test!!"));
(4)接收消息
共有四种方式,各功能不同,这是其中之一:
//主线程接收消息 @Subscribe(threadMode = ThreadMode.MAIN) public void onUserEvent(MessageEvent event) { //此处处理消息 //如果多个消息,可在实体类中添加type区分消息 }
threadMode = ThreadMode.MAIN 可以替换,根据自己的需要 选择处理消息的方式,以下是四种方式的具体含义:
ThreadMode.MAIN:表示无论事件是在哪个线程发布出来的,该事件订阅方法onEvent都会在UI线程中执行,这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所有在此模式下的方法是不能执行耗时操作的。
ThreadMode.POSTING:表示事件在哪个线程中发布出来的,事件订阅函数onEvent就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
ThreadMode.BACKGROUND:表示如果事件在UI线程中发布出来的,那么订阅函数onEvent就会在子线程中运行,如果事件本来就是在子线程中发布出来的,那么订阅函数直接在该子线程中执行。
ThreadMode.AYSNC:使用这个模式的订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程来执行订阅函数。
(5)解除注册
EventBus.getDefault().unregister(this);
二、应用实例
1、接收消息的activity
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); EventBus.getDefault().register(this); findViewById(R.id.redirect).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SendActivity.class); startActivity(intent); } }); } //主线程接收消息 @Subscribe(threadMode = ThreadMode.MAIN) public void onUserEvent(MessageEvent event) { //如果多个消息,可在实体类中添加type区分消息 Log.d("Event bus"," receive message is: "+event.getMessage()); } @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); }}
2、发送消息的activity
public class SendActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_send ); EventBus.getDefault().register(this); FloatingActionButton fab = (FloatingActionButton) findViewById( R.id.fab ); fab.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { EventBus.getDefault().post(new MessageEvent("hello message test!!")); } } ); }}
3、程序逻辑
MainActivity点击按钮跳转到SendActivity,SendActivity 右下角有一个按钮FloatingActionButton,点击发送MessageEvent 类型的消息。
MainActivity收到该消息后打印该event携带的信息。
4、输出结果
08-08 16:30:42.984 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
08-08 16:30:43.883 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
08-08 16:30:44.703 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
08-08 16:30:45.322 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
08-08 16:30:45.959 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
08-08 16:30:46.595 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
08-08 16:30:47.933 11795-11795/com.sunmedia.eventbus D/Event bus: receive message is: hello message test!!
4、Demo工程
https://github.com/yanhu0614/Event-bus-simple-demo
四、其他相关特性
- Event bus的消息发送采取广播形式,所以可以在多个类中进行订阅,均会收到消息;
- 注册和发送的类不受限制,任意类均可,不限于activity类型;
- 同一个类注册多个方法接收相同的事件或者消息,每一个方法都会得到执行;
- 通知的优先级,能够保证 Subscriber 关注最重要的通知;
- 粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。
- 可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。
五、与handle message 、BroadcastReceiver的比较
1.Handle message
没有解耦
- 需要由接收方提供handle,发送方调用handle进行发送;
不能简单实现广播
- 每一个handle对应一个接收者,要实现广播,只能通过建立一个handle 管理中心,通过遍历的方式来判断哪些handle需要发送消息
2.Broadcast
如果与android系统进行相关的通知,还是要选择本地广播;在BroadcastReceiver的 onReceive方法中,可以获得Context 、intent参数,这两个参数可以调用许多的sdk中的方法,而eventbus获得这两个参数相对比较困难;
因此广播相对于其他的方式而言,广播是重量级的,消耗资源较多的方式。他的优势体现在与sdk连接紧密,如果需要同 android 交互的时候,广播的便捷性会抵消掉它过多的资源消耗,但是如果不同android交互,或者说,只做很少的交互,使用广播是一种浪费;
六、参考和感谢
http://www.jianshu.com/p/a040955194fc
http://blog.csdn.net/crazy_yyyyy/article/details/51318092
- Android Event bus 消息/事件通信框架介绍和应用,以及与handle message和broadcastreceiver之间的比较
- ZStack OSAL的事件(event)与消息(message)
- Spring事件 Event 为bean与bean之间的消息通信提供支持
- Handle、Looper与Message之间的关系
- Message Queue和handle
- Android组件间通信机解耦——Android EventBus和Otto框架一、前言 传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之
- RabbitMQ message bus的安装和入门
- RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较
- 消息队列的应用场景和常见的消息队列之间的比较
- ZStack OSAL的事件(event)与消息(message)——part1
- ZStack OSAL的事件(event)与消息(message)——part 2
- ZStack OSAL的事件(event)与消息(message)——part1 & part2
- ZStack OSAL的事件(event)与消息(message)——part1 & part2
- ZStack OSAL的事件(event)与消息(message)----2
- Android 消息机制 以及Message、Handler、Message Queue、Looper之间的关系。
- 线程间通信的消息机制的Message和Handler
- Android的跨进程通信介绍----------------aidl,传递复杂对象以及Server和Clicent之间的回调
- 事件和消息的通信机制
- python实例(判断)
- RGB颜色参考-ASCII对照表-HTTP状态码
- JAVA 实现MD5加密算法
- 解决Android版本更新,安装失败
- react native 更新后packager启动失败:SyntaxError: Unexpected token ...
- Android Event bus 消息/事件通信框架介绍和应用,以及与handle message和broadcastreceiver之间的比较
- STM32 内部时钟输出PA.8(MCO)
- gcd崩溃系统堆栈等,iOS性能相关度量技术,很不错,备查。
- Qt播放WAV格式音频文件的两种方法
- 每日一题(28)—— 引用与指针的区别
- 5. Zookeeper精要-Zookeeper Watches
- SpringBoot 启动服务器失败 报错 spring-boot Failed to start component [StandardServer[-1]]
- Java replaceAll()方法报错Illegal group reference
- truncate/delete/drop的区别?