AdaptySDK-Android icon indicating copy to clipboard operation
AdaptySDK-Android copied to clipboard

fix: decode bitmaps off main thread in ImageElement

Open frankjoshua opened this issue 10 months ago • 3 comments

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 avatar Apr 09 '25 21:04 frankjoshua

I forgot to mention. Fixes #30

frankjoshua avatar Apr 09 '25 21:04 frankjoshua

Hi @frankjoshua, thank you for your contribution! We’ll review it and I’ll get back to you soon.

vladd-g avatar Apr 11 '25 12:04 vladd-g

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.

frankjoshua avatar Aug 15 '25 20:08 frankjoshua