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

  1. Call unregister(this) in the matching lifecycle teardown (e.g. onPause()/onDestroy()) for every register(this) in onCreate()/onResume()
  2. Guard registration with EventBus.getDefault().isRegistered(this) before calling register()
  3. Remove the duplicate register() call (search for all register( invocations for the class named in the message)
  4. 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

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


AI-assisted analysis of greenrobot/EventBus@0194926b3b (2026-08-14). Data as JSON: /api/errors/13ebada39be933b4. Report an issue: GitHub.