Android发布订阅事件总线EventBus

来源:互联网 发布:湖南干部培训网络 编辑:程序博客网 时间:2024/06/01 09:14

概述

什么是EventBus?

EventBus内部角色介绍

配置

实战案例


概述

在之前传统的Android开发中,线程间或者Activity、Service等组件之间传递消息我们比较倾向于Intent、Handler、Broadcast去实现。接下来跟大家探讨一个很好用的Android的发布/订阅事件总线框架EventBus,这个框架在之前的项目中也有使用过,直到今天才决定整理一片文章梳理下该框架,方便自己梳理内容和提供给大家参考。

什么是EventBus?

EventBus是用于Android的发布/订阅事件总线机制的框架,主要功能是替代Intent、Handler、Broadcast在例如Activity、Fragment这样的功能组件之间或者是线程间的消息传递,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。EventBus的优点在于代码优雅,消耗更少,并且将发送者与接受者解耦(降低两者之间的依赖程度)。

EventBus内部角色介绍

Event :传递的事件对象
Subscriber :事件的订阅者
Publisher:事件的发布者
ThreadMode :定义EventBus的线程模式

EventBus官方逻辑图

EventBus的大致工作流程是先自定义一个类,定义一个事件(Event)类型。然后在要接收消息的界面(订阅者Subscriber)进行注册。接下来在要发送信息的界面(发布者Publisher)进行信息的发送。消息发出后然后在订阅者的界面进行消息的接收。当所有操作完成之后解除EventBus的注册。

EventBus的四种线程模式
ThreadMode.POSTIONG:表示该方法会在当前发布事件的线程执行,默认的线程模式
ThreadMode.MAIN:表示在UI线程(主线程)中执行。
ThreadMode.BACKGROUND:如果当前线程不是主线程,则在当前线程执行。否则加入后台任务队列,使用线程池调用。
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用。

Subscriber Priorities(优先级)
优先级顾名思义,等级越高越先执行。EventBus可以通过调整priority来设置优先级,用整数来设置,数字的值越大优先级别越高,越优先执行。

配置

方式一:下载jar包导入工程
Jar包下载地址:https://github.com/greenrobot/EventBus/releases
下载好EventBus的jar包后导入项目的libs目录,然后右键add as library

方式二:在build.gradle中添加网络依赖
compile ‘org.greenrobot:eventbus:3.0.0’

实战案例

为了更好的理解EventBus的工作机制,找了一个Demo加上注解,方便理解。
首先自定义一个类,用来定义事件类型:

public class MyEvent {    private String mMsg;    public MyEvent(String msg){        mMsg = msg;    }    public String getMsg(){        return mMsg;    }}

然后在要接收消息的界面(订阅者Subscriber)进行注册、信息接收:

/** * 事件的订阅者   Subscriber */public class MainActivity extends Activity {    Button button;    TextView textview;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //在要接收消息的页面进行注册        EventBus.getDefault().register(this);        button = (Button) findViewById(R.id.btn01);        textview = (TextView) findViewById(R.id.tv01);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(MainActivity.this,                        SecondActivity.class);                startActivity(intent);            }        });    }    public void onEventMainThread(FirstEvent event) {        String msg = "onEventMainThread收到了消息:" + event.getMsg();        tv.setText(msg);        Toast.makeText(this, msg , Toast.LENGTH_SHORT).show();    }        @Override    protected void onDestroy() {        super.onDestroy();        //在onDestroy生命周期中解除注册        EventBus.getDefault().unregister(this);    }}

接下来在要发送信息的界面(发布者Publisher)进行信息的发送:

/** * 事件发布者  Publisher */public class SecondActivity extends Activity {    private Button btn_SendMsg;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        btn_SendMsg = (Button) findViewById(R.id.btn_first_event);        btn_SendMsg.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //发送事件                EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));            }        });    }}
原创粉丝点击