{"record":{"id":"711a931201e91c91","repo":"bumptech/glide","slug":"cannot-unregister-not-yet-registered-manager","errorCode":null,"errorMessage":"Cannot unregister not yet registered manager","messagePattern":"Cannot unregister not yet registered manager","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"library/src/main/java/com/bumptech/glide/Glide.java","lineNumber":691,"sourceCode":"      }\n    }\n\n    return false;\n  }\n\n  void registerRequestManager(RequestManager requestManager) {\n    synchronized (managers) {\n      if (managers.contains(requestManager)) {\n        throw new IllegalStateException(\"Cannot register already registered manager\");\n      }\n      managers.add(requestManager);\n    }\n  }\n\n  void unregisterRequestManager(RequestManager requestManager) {\n    synchronized (managers) {\n      if (!managers.contains(requestManager)) {\n        throw new IllegalStateException(\"Cannot unregister not yet registered manager\");\n      }\n      managers.remove(requestManager);\n    }\n  }\n\n  @Override\n  public void onTrimMemory(int level) {\n    trimMemory(level);\n    // when level is higher than TRIM_MEMORY_UI_HIDDEN, it indicates that the app is\n    // in the background, limit the memory usage by memoryCategoryInBackground.\n    if (level > TRIM_MEMORY_UI_HIDDEN) {\n      setMemoryCategoryWhenInBackground();\n    }\n  }\n\n  @Override\n  public void onConfigurationChanged(Configuration newConfig) {\n    // Do nothing.","sourceCodeStart":673,"sourceCodeEnd":709,"githubUrl":"https://github.com/bumptech/glide/blob/eb14a895d8f866e6a08c3e19d50ea3bd2c12c20a/library/src/main/java/com/bumptech/glide/Glide.java#L673-L709","documentation":"Thrown by Glide.unregisterRequestManager() when the given RequestManager is not present in the internal managers set. Glide requires an unregister to correspond to a prior successful register to keep lifecycle accounting consistent.","triggerScenarios":"unregisterRequestManager(requestManager) is called and managers.contains(requestManager) is false.","commonSituations":"Calling unregister twice for the same manager; unregistering a manager that was never registered; a lifecycle hook firing teardown after the manager was already removed; a race where another path removed it first.","solutions":["Guard unregister with a contains check, or track registration state before calling unregister.","Ensure register/unregister are balanced and idempotent around the same lifecycle events.","Avoid calling unregister from multiple paths for the same RequestManager.","Prefer Glide.with(...).onDestroy()/lifecycle management which handles pairing internally."],"exampleFix":"// before\nglide.unregisterRequestManager(manager) // called twice -> throws second time\n\n// after\nsynchronized(monitor) {\n  if (registeredManagers.remove(manager)) {\n    glide.unregisterRequestManager(manager)\n  }\n}","handlingStrategy":"validation","validationCode":"// Guard unregister against missing registrations.\nfun unregisterIfPresent(glide: Glide, manager: RequestManager) {\n  if (registered.remove(manager)) {\n    glide.unregisterRequestManager(manager)\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pair each unregister with a successful register; track state explicitly.","Avoid unregistering from multiple paths for the same manager.","Use Glide.with(...).onDestroy() for lifecycle-managed teardown."],"tags":["glide-core","requestmanager","lifecycle","registration","runtime"],"backgroundTag":null,"analyzedSha":"eb14a895d8f866e6a08c3e19d50ea3bd2c12c20a","analyzedAt":"2026-08-14T01:43:54.821Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}