Skip to content

fix(android): move TcSdk.init() to background thread to prevent ANR#70

Open
Keyur Gandhi (keyurgit45) wants to merge 3 commits intotruecaller:masterfrom
keyurgit45:fix/background-init-anr
Open

fix(android): move TcSdk.init() to background thread to prevent ANR#70
Keyur Gandhi (keyurgit45) wants to merge 3 commits intotruecaller:masterfrom
keyurgit45:fix/background-init-anr

Conversation

@keyurgit45

TcSdk.init() performs synchronous ContentResolver.query() to the Truecaller app's ContentProvider, which can block for seconds when the Truecaller app is slow to respond. Since Flutter MethodChannels dispatch to the Android main thread, this blocks the UI thread and triggers ANR.

This change wraps TcSdk.init() in a single-thread executor so the ContentProvider queries run on a background thread. The result is posted back to the main thread via Handler for the MethodChannel response.

TcSdk.init() performs synchronous ContentResolver.query() to the
Truecaller app's ContentProvider, which can block for seconds when
the Truecaller app is slow to respond. Since Flutter MethodChannels
dispatch to the Android main thread, this blocks the UI thread and
triggers ANR.

This change wraps TcSdk.init() in a single-thread executor so the
ContentProvider queries run on a background thread. The result is
posted back to the main thread via Handler for the MethodChannel
response.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…hutdown

- Add AtomicBoolean guard to prevent result.success() after cleanUp()
  detaches the MethodChannel (fixes IllegalStateException on stale reply)
- Use shutdown() instead of shutdownNow() so in-flight TcSdk.init()
  completes gracefully instead of being interrupted mid-execution
- Recreate executor in onAttachedToActivity() after prior shutdown
- Per-call resultConsumed AtomicBoolean prevents double-reply

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…fter init

- Wrap ioExecutor.execute in try-catch for RejectedExecutionException
  to prevent crash during rapid detach-reattach (config change)
- Submit TcSdk.clear() to executor before shutdown() so it runs after
  any in-flight TcSdk.init() completes, preventing data race on the
  TcSdk singleton

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments