didi/DoKit · error · IllegalStateException

RequestHandler already registered.

Error message

RequestHandler already registered.

What it means

DokitPicasso.Builder.addRequestHandler() throws IllegalStateException when the exact same RequestHandler instance is registered twice. The builder tracks registered handlers by identity to avoid duplicate handler consultation and double work during request resolution.

Source

Thrown at Android/dokit/src/main/java/com/didichuxing/doraemonkit/picasso/DokitPicasso.java:797

        throw new IllegalArgumentException("Transformer must not be null.");
      }
      if (this.transformer != null) {
        throw new IllegalStateException("Transformer already set.");
      }
      this.transformer = transformer;
      return this;
    }

    /** Register a {@link RequestHandler}. */
    public Builder addRequestHandler(RequestHandler requestHandler) {
      if (requestHandler == null) {
        throw new IllegalArgumentException("RequestHandler must not be null.");
      }
      if (requestHandlers == null) {
        requestHandlers = new ArrayList<RequestHandler>();
      }
      if (requestHandlers.contains(requestHandler)) {
        throw new IllegalStateException("RequestHandler already registered.");
      }
      requestHandlers.add(requestHandler);
      return this;
    }

    /**
     * @deprecated Use {@link #indicatorsEnabled(boolean)} instead.
     * Whether debugging is enabled or not.
     */
    @Deprecated public Builder debugging(boolean debugging) {
      return indicatorsEnabled(debugging);
    }

    /** Toggle whether to display debug indicators on images. */
    public Builder indicatorsEnabled(boolean enabled) {
      this.indicatorsEnabled = enabled;
      return this;
    }

View on GitHub (pinned to 626827cddb)

Solutions

  1. Register each handler instance exactly once; dedupe with a Set before registering
  2. Make init idempotent so the builder path only runs one time
  3. If re-registration is intended, create a new handler instance or skip when already present

Example fix

// before
Set<RequestHandler> registered = new HashSet<>();
for (RequestHandler h : handlers) {
  builder.addRequestHandler(h); // IllegalStateException on duplicate instance
}

// after
Set<RequestHandler> unique = new LinkedHashSet<>(handlers);
for (RequestHandler h : unique) {
  builder.addRequestHandler(h);
}
Defensive patterns

Strategy: validation

Validate before calling

Set<RequestHandler> unique = new LinkedHashSet<>(handlers);
for (RequestHandler h : unique) { builder.addRequestHandler(h); }

Try / catch

try { builder.addRequestHandler(h); } catch (IllegalStateException e) { if (!e.getMessage().contains("RequestHandler already registered")) throw e; }

Prevention

When it happens

Trigger: Calling builder.addRequestHandler(h) twice with the same instance, e.g. a shared handler singleton registered by both library init and app init.

Common situations: Initialization code run more than once (activity re-entry into an init method); a singleton handler registered in a loop over modules where two modules share it.

Related errors


AI-assisted analysis of didi/DoKit@626827cddb (2026-08-14). Data as JSON: /api/errors/e308ba734fd8ce09. Report an issue: GitHub.