Android发布订阅事件总线EventBus

概述

什么是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"));
            }
        });

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值