Почему не стоит передавать Bitmap в Intent

Ответ

Передача Bitmap через Intent не рекомендуется, так как Bitmap реализует Parcelable, но может превысить лимит размера данных (обычно 1MB для Binder). Это вызовет TransactionTooLargeException.

Лучшие альтернативы:

  1. Сохранение во временный файл и передача URI через Intent
  2. Использование глобального кеша (например, Application-класс)
  3. Использование библиотек типа Glide для загрузки по URI

Пример с файлом:

// Сохранение
val file = File(context.cacheDir, "temp.png")
bitmap.compress(Bitmap.CompressFormat.PNG, 100, file.outputStream())

// Передача
intent.putExtra("image_path", file.absolutePath)

Ответ 18+ 🔞

Ёпта, народ, тут такая тема интересная вылезла — про передачу картинок между активити. Ситуация, в общем, пизда рулю, если по-простому.

Вот представь: ты пытаешься запихнуть здоровенный Bitmap в Intent, типа «на, передай другому экрану». Ну, Bitmap же вроде как Parcelable, да? Вроде бы должно лететь. Ан нет, блядь! Тут тебя накрывает медным тазом под названием TransactionTooLargeException. Это как пытаться протащить диван через почтовый ящик — не влезает, сука. Лимит у Binder'а, этой системной хуйни, всего около 1MB. Картинка побольше — и всё, приехали, будет вам хиросима и нигерсраки в логах.

Так что, чувак, доверия к этому способу — ебать ноль. Надо делать по-умному.

Вот тебе три рабочих варианта, выбирай какой удобнее:

1. Сохранение во временный файл — классика жанра. Суть: пишешь картинку в кеш приложения, а в интенте передаёшь только путь к файлу. Просто, как три копейки.

// Сохраняем bitmap в кеш
val file = File(context.cacheDir, "temp.png")
bitmap.compress(Bitmap.CompressFormat.PNG, 100, file.outputStream())

// Кидаем путь в интент
intent.putExtra("image_path", file.absolutePath)

Потом на той стороне просто читаешь этот путь и грузишь картинку обратно. Никаких лимитов не боится, если место на диске есть.

2. Глобальный кеш через Application-класс. Типа создаёшь какую-нибудь мапу HashMap<String, Bitmap> в своём классе-приложении. Кидаешь bitmap туда с уникальным ключом, а в интенте передаёшь только этот ключ. Второй активити достаёт по ключу. Но тут надо не забывать чистить за собой, а то память сожрёшь — овердохуища.

3. Библиотеки в помощь (Glide, Picasso и т.д.). Если картинка из сети или галереи — вообще идеально. Передаёшь просто URI (на файл или ссылку), а на другой стороне библиотека сама всё грамотно подгрузит и отобразит. Не надо велосипедов изобретать.

Короче, вывод простой: не пихай Bitmap в Intent напрямую. Это путь в никуда, чистая лотерея, которая почти всегда заканчивается крестом. Работай с файлами, URI или кешом — и будет тебе счастье, а не исключение на ровном месте. Сам от такой ошибки в своё время охуел, теперь только так и делаю.