greenrobot/EventBus · error · EventBusException
Subscriber ${subscriber.getClass()} already registered to ev
Error message
Subscriber ${subscriber.getClass()} already registered to event ${eventType} What it means
Thrown from the private subscribe() method (called inside a synchronized block from register()) when the per-event-type subscription list already contains an equal Subscription for this subscriber. EventBus refuses double registration of the same subscriber instance for the same event type because each register() would otherwise deliver each event twice to the same method. Subscription equality is subscriber instance + subscriber method, so this fires on a redundant register() call for the same object.
Source
Thrown at EventBus/src/org/greenrobot/eventbus/EventBus.java:168
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
synchronized (this) {
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod);
}
}
}
// Must be called in synchronized block
private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {
Class<?> eventType = subscriberMethod.eventType;
Subscription newSubscription = new Subscription(subscriber, subscriberMethod);
CopyOnWriteArrayList<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
if (subscriptions == null) {
subscriptions = new CopyOnWriteArrayList<>();
subscriptionsByEventType.put(eventType, subscriptions);
} else {
if (subscriptions.contains(newSubscription)) {
throw new EventBusException("Subscriber " + subscriber.getClass() + " already registered to event "
+ eventType);
}
}
int size = subscriptions.size();
for (int i = 0; i <= size; i++) {
if (i == size || subscriberMethod.priority > subscriptions.get(i).subscriberMethod.priority) {
subscriptions.add(i, newSubscription);
break;
}
}
List<Class<?>> subscribedEvents = typesBySubscriber.get(subscriber);
if (subscribedEvents == null) {
subscribedEvents = new ArrayList<>();
typesBySubscriber.put(subscriber, subscribedEvents);
}
subscribedEvents.add(eventType);View on GitHub (pinned to 0194926b3b)
Solutions
- Call unregister(this) in the matching lifecycle teardown (e.g. onPause()/onDestroy()) for every register(this) in onCreate()/onResume()
- Guard registration with EventBus.getDefault().isRegistered(this) before calling register()
- Remove the duplicate register() call (search for all register( invocations for the class named in the message)
- Keep registration in exactly one lifecycle callback pair per component
Example fix
// before
@Override
protected void onResume() {
super.onResume();
EventBus.getDefault().register(this); // called again -> already registered
}
// after
@Override
protected void onResume() {
super.onResume();
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
} Defensive patterns
Strategy: validation
Validate before calling
EventBus bus = EventBus.getDefault();
if (!bus.isRegistered(this)) {
bus.register(this);
} Try / catch
try {
EventBus.getDefault().register(this);
} catch (EventBusException e) {
if (String.valueOf(e.getMessage()).contains("already registered")) {
EventBus.getDefault().unregister(this);
EventBus.getDefault().register(this);
} else {
throw e;
}
} Prevention
- Pair every register() with an unregister() in the mirrored lifecycle callback
- Wrap registration in a single helper that checks isRegistered() first
- Register in exactly one place per component (e.g. base class only)
When it happens
Trigger: Calling register(this) twice on the same subscriber instance without an intervening unregister(this) — e.g. register in both onCreate() and onResume() of an Android Activity; re-registering a cached singleton presenter; calling register() again after a configuration change where the same instance survived.
Common situations: Android lifecycle overlap (onCreate + onStart both registering), retained fragments or presenters registered repeatedly, defensive 'make sure I'm registered' register() calls in loops, or a register() added in a base class plus another in the subclass.
Related errors
- It looks like you are using EventBus on Android, make sure t
- Unexpected exception
- Could not find subscriber method in ${subscriberClass}. Mayb
- Could not send handler message
- This method may only be called from inside event handling me
AI-assisted analysis of greenrobot/EventBus@0194926b3b (2026-08-14).
Data as JSON: /api/errors/13ebada39be933b4.
Report an issue: GitHub.