Event Bus

EventBus 是一个Android和Java的开源库,使用发布者/订阅者模式进行松耦合。 EventBus支持集中通信,只需几行代码就可以解耦类——简化代码,消除依赖关系,加快应用程序开发。

优点

  • 简化了组件之间的通信

  • 分离事件发送方和接收方

  • 使用UI工件(例如活动、片段)和后台线程表现良好

  • 避免复杂和容易出错的依赖关系和生命周期问题

  • 快;专为高性能而优化

  • 很小(< 50 k jar)

  • 1亿+安装的应用程序在实践中证明了这一点

  • 具有高级特性,如交付线程、订阅服务器优先级等。

快速开始

maven 引入

<dependency>
    <groupId>org.greenrobot</groupId>
    <artifactId>eventbus</artifactId>
    <version>3.1.1</version>
</dependency>

定义

  • MessageEvent.java

信息的载体,最基础的 Java 类

public class MessageEvent {

    private final String message;

    public MessageEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

}
  • EventService.Java

这个类,使用了 @Subscribe 指定监听方法,且指定了注册监听和取消监听的方法。

备注

上述方法的指定,在 Event3 中,对方法名称无要求。

public class EventService {

    /**
     * This method will be called when a MessageEvent is posted
     * @param event 事件
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        System.out.println("on message of event"+event.getMessage());
    }

    /**
     * 开始监听
     */
    public void startListen() {
        EventBus.getDefault().register(this);
    }

    /**
     * 停止监听
     */
    public void stopListen() {
        EventBus.getDefault().unregister(this);
    }

}
  • Main.java
public class Main {

    public static void main(String[] args) {
        MessageEvent event = new MessageEvent("Event bus msg");
        EventService eventService = new EventService();
        eventService.startListen();

        System.out.println("Start Listen...");
        EventBus.getDefault().post(event);
        EventBus.getDefault().post(event);

        System.out.println("Stop Listen...");
        eventService.stopListen();
        EventBus.getDefault().post(event);
    }
}

测试结果:

Start Listen...
on message of eventEvent bus msg
on message of eventEvent bus msg
Stop Listen...
[FINE] No subscribers registered for event class com.github.houbb.jdk.eventbus.domain.MessageEvent
[FINE] No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent