Android事件总线EventBus 3.0的基本使用

一、概述

Android组件间、线程间的通信,可以用Handler,BroadcastReceiver,回调等方法来实现,但是这些方法的实现有些繁琐。EventBus可以完成以上所有功能,并采用了“订阅/发布模式”,使代码更优雅、更好的解耦。相似的框架还有Otto、RxBus等,今天先来讲讲EventBus的基本使用。

二、实战

添加依赖

compile 'org.greenrobot:eventbus:3.0.0'

发送广播

1.将需要发送的数据封装成类

public class EventType {
    private int type;

    public EventType(int type) {
        this.type = type;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }
}

2.发送数据

  • 发送普通广播
EventBus.getDefault().post(new EventType(6666));

post(Object event)参数必须与接收方法的参数类型相同,也就是需要发送的数据。不懂这句话没关系,下面会提到。

  • 发送粘性广播
EventBus.getDefault().postSticky(new EventType(6666));

PS:粘性广播是指当接收事件还没创建之前,发送方发出的最后一个广播。

接收广播

1.注册

@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

2.注销

@Override
protected void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

3.接收方法

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 100)
public void showData(EventType eventType){
    Log.d(TAG, "showData: ");
}

用@Subscribe注解来标识接收事件的方法,@Subscribe(ThreadMode threadmode, boolean sticky, int priority)的三个参数都是可选参数。
1. 参数1:用于指定接收方法执行在哪个线程中,默认为POSTING。

POSTING:与发送事件处于同一线程
MAIN:执行在主线程
BACKGROUND:执行在子线程,如果发送事件在子线程中,那么接收事件也会执行在此线程中
ASYNC:执行在新建的子线程,用于执行耗时操作

2. 参数2:是否接收粘性广播,默认为false。
3. 参数3:接收事件的优先级,默认为0。数越大,优先级越高。只有当多个接收事件处于同一线程中,优先级才会起作用。


注意
1.接收方法的方法名随意,但参数类型必须与发送方法post()的参数相同。
2.接收方法不能被private修饰。

取消/拦截广播

EventBus.getDefault().cancelEventDelivery(new EventType(6666));

cancelEventDelivery(Object)取消广播,Object是消息内容。
只有当threadMode为POSTING时,才会取消广播。

三、原理

EventBus.getDefault().register(this);

在注册这个类的时候,会用一个集合记录这个类和这个类订阅的方法

EventBus.getDefault().unRegister(this);

在注销这个类的时候,会用在原来集合里删除这个类和这个类订阅的方法

EventBus.getDefault().post(this);

在发送广播时,筛选出与发送事件的实参类型相同的接收方法,再调用这些方法

EventBus最终是利用注解加反射来实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈哈利波特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值