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

阅读全文
0 0
原创粉丝点击