返回

从AndroidEventBus源码解析为何监听事件执行两次

Android

EventBus是一个Android事件总线库,它允许你在不同的组件之间发送和接收事件。它使用简单,易于使用,而且非常强大。

EventBus已经在2018年6月停止维护了。如果你正在使用EventBus,你可能需要考虑迁移到另一个库。EventBus官方推荐使用StickyEvent

虽然EventBus已经停止维护了,但是它仍然是一个非常流行的库。在本文中,我们将通过阅读EventBus的源码来了解EventBus是如何工作的。

事件注册

EventBus使用注解来注册事件监听器。当一个类被注解了@Subscribe注解时,该类中的方法就会被注册为一个事件监听器。

例如,以下代码注册了一个监听MessageEvent事件的监听器:

@Subscribe
public void onMessageEvent(MessageEvent event) {
  // Do something with the event
}

事件发布

事件可以使用EventBus.getDefault()方法发布。例如,以下代码发布了一个MessageEvent事件:

EventBus.getDefault().post(new MessageEvent());

事件分发

当一个事件被发布时,EventBus会将其分发给所有注册了该事件的监听器。监听器可以使用@Subscribe注解指定它要监听的事件类型。

例如,以下代码注册了一个监听MessageEvent事件的监听器:

@Subscribe
public void onMessageEvent(MessageEvent event) {
  // Do something with the event
}

当一个MessageEvent事件被发布时,EventBus会将该事件分发给所有注册了MessageEvent事件的监听器。

停止订阅

当你不再需要某个事件的监听时,你应该取消订阅该事件。你可以使用EventBus.getDefault().unregister()方法取消订阅事件。

例如,以下代码取消订阅MessageEvent事件:

EventBus.getDefault().unregister(this);

问题

我最近在使用EventBus的时候遇到一个问题,同一个消息被同一个监听执行了两次。

我一开始以为是EventBus出了问题,但是在阅读了EventBus的源码之后,我发现问题出在我自己身上。

我忘记在onDestroy()方法中取消订阅事件了。

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

结论

通过阅读EventBus的源码,我了解了EventBus是如何工作的,也解决了监听器执行两次的问题。

EventBus是一个非常强大的库,它可以帮助我们轻松地实现事件通信。但是,在使用EventBus时,我们需要记住在onDestroy()方法中取消订阅事件。