fix: decode bitmaps off main thread in ImageElement #33
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fix: Avoid decoding bitmaps on the main thread
Summary
This PR updates
ImageElement
to decode bitmaps off the main thread. Previously, bitmap decoding happened inside aremember
block during composition, which could cause jank or dropped frames — especially with larger assets.The fix moves the decoding logic into a background coroutine (
Dispatchers.Default
), keeping everything else (alignment, scaling, tint) intact. This change improves performance and helps keep the UI thread smooth.Why it matters
Decoding on the main thread is risky, particularly on lower-end devices or when rendering paywalls with high-res assets. This update keeps composition lightweight and improves responsiveness across the board.
Implementation Notes
withContext(Dispatchers.Default)
.getBitmap
logic or behavior.Suggestion: Consider moving to Coil
As a future improvement, I’d recommend exploring Coil. It’s designed for Compose, handles background decoding out of the box, and brings built-in caching, lifecycle awareness, and error handling.
That said, I realize migrating away from
getBitmap
may be tricky since it's used in other places like Modifiers — but it could be worth considering long term.