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
- Register each handler instance exactly once; dedupe with a Set before registering
- Make init idempotent so the builder path only runs one time
- 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
- Dedupe handlers by instance identity before registering
- Make Picasso initialization run exactly once (guard with a boolean or singleton)
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
- Downloader already set.
- Executor service already set.
- Memory cache already set.
- Listener already set.
- Transformer already set.
AI-assisted analysis of didi/DoKit@626827cddb (2026-08-14).
Data as JSON: /api/errors/e308ba734fd8ce09.
Report an issue: GitHub.