EventBus的基本使用

简介

EventBus是一种用于Android的发布/订阅事件总线。它有很多优点:简化应用组件间的通信;解耦事件的发送者和接收者;避免复杂和容易出错的依赖和生命周期的问题;很快,专门为高性能优化过等等。

基本使用

准备工作

  1. 创建一个工具类,里面封装了一些基本方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class EventBusUtil {

    public static void register(Object subscriber) {
    EventBus.getDefault().register(subscriber);
    }

    public static void unregister(Object subscriber) {
    EventBus.getDefault().unregister(subscriber);
    }

    public static void sendEvent(Event event) {
    EventBus.getDefault().post(event);
    }

    public static void sendStickyEvent(Event event) {
    EventBus.getDefault().postSticky(event); //后续注册的订阅者依然可以从内存中得到这个已发送的sticky事件
    }
    }
  2. 创建一个基本事件类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class Event<T> {

    private int code; //该字段用于判断事件的发送源
    private T data; //事件类型

    public Event(int code, T data) {
    this.code = code;
    this.data = data;
    }

    public int getCode() {
    return code;
    }

    public void setCode(int code) {
    this.code = code;
    }

    public T getData() {
    return data;
    }

    public void setData(T data) {
    this.data = data;
    }
    }
  3. 封装到基类(BaseActivity、BaseFragment)

    1
    2
    3
    4
    5
    6
    7
    8
    /**
    * 是否注册EventBus,注册后才可以订阅事件
    *
    * @return true表示绑定EventBus事件分发,默认不绑定,子类需要绑定的话复写此方法返回true.
    */
    protected boolean isRegisterEventBus() {
    return false;
    }

在onCreated方法中加入

1
2
3
if (isRegisterEventBus()) {
EventBusUtil.register(this);
}

在onDestroy方法中加入

1
2
3
if (isRegisterEventBus()) {
EventBusUtil.unregister(this);
}

在代码中使用

  1. 接收事件

例如某个Activity要接收事件,则其首先要注册Eventbus

1
2
3
4
@Override
protected boolean isRegisterEventBus() {
return true;
}

然后写一个接收事件的方法

1
2
3
4
5
6
7
8
9
10
11
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventCome(Event<MainEvent> event) {
switch (event.getCode()) {
case EventBusCode.Login2Main:
case EventBusCode.Register2Main:
updateAfterLoginOrRegister(event.getData().getUserName()); //更新用户信息
break;
default:
break;
}
}

EventBusCode是用来区分不同活动发来的事件

1
2
3
4
public class EventBusCode {
public static final int Register2Main = 0;
public static final int Login2Main = 1;
}

  1. 发送事件
    例如在登录活动中发送一个事件给主活动
    1
    2
    3
    //更新用户信息
    Event<MainEvent> mainEvent = new Event<>(EventBusCode.Login2Main, new MainEvent(userName));
    EventBusUtil.sendEvent(mainEvent);

发送黏性事件

所谓的黏性事件,就是指发送了该事件之后再注册的订阅者依然能够接收到的事件。简单来说就是可以把事件发送到未启动的活动中。

使用

  1. 在订阅事件处添加 sticky = true属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onStickyEventBusCome(Event<ShowArticleEvent> event) {
    switch (event.getCode()) {
    case EventBusCode.Home2ShowArticle:
    mLink = event.getData().getLink();
    mTitle = event.getData().getTitle();
    break;
    default:
    break;
    }
    }
  2. 发布事件处发送黏性事件

    1
    EventBusUtil.sendStickyEvent(event);

封装

参考资料

-------------    本文到此结束  感谢您的阅读    -------------
0%