fix: decode bitmaps off main thread in ImageElement#33
Open
frankjoshua wants to merge 3 commits intoadaptyteam:masterfrom
Open
fix: decode bitmaps off main thread in ImageElement#33frankjoshua wants to merge 3 commits intoadaptyteam:masterfrom
frankjoshua wants to merge 3 commits intoadaptyteam:masterfrom
Conversation
Author
|
I forgot to mention. |
Contributor
|
Hi @frankjoshua, thank you for your contribution! We’ll review it and I’ll get back to you soon. |
- Combined off-main-thread bitmap decoding improvement with master's API changes - Preserved the produceState + Dispatchers.Default pattern for background decoding - Updated to use getAsset() instead of getForCurrentSystemTheme() - Added context parameter to getBitmap() call - Updated property access to use image?.main?.source?.javaClass
Author
|
Rebased to 3.10.0. This keeps test integration StrictMode-safe (prevents false positives) with no runtime/API changes. Resubmitting since last release didn’t merge—would appreciate inclusion this time. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
ImageElementto decode bitmaps off the main thread. Previously, bitmap decoding happened inside arememberblock 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).getBitmaplogic 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
getBitmapmay be tricky since it's used in other places like Modifiers — but it could be worth considering long term.