Skip to content

Conversation

frankjoshua
Copy link

@frankjoshua frankjoshua commented Apr 9, 2025

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 a remember 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

  • Decoding now runs on a background thread using withContext(Dispatchers.Default).
  • No changes to the existing 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.

@frankjoshua
Copy link
Author

I forgot to mention.
Fixes #30

@vladd-g
Copy link
Contributor

vladd-g commented Apr 11, 2025

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
@frankjoshua
Copy link
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.

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.

2 participants