当前位置: 首页 > news >正文

android 大图传递如何避免OOM

        在同一个进程内,两个 Activity 之间传递大图,面临着和跨进程通信(IPC)一模一样的致命红线:TransactionTooLargeException。这是因为,当你使用Intent.putExtra("bitmap", bitmap)时,系统底层依然会使用 Binder 传输机制将数据拷贝到系统进程。而系统为每个应用分配的 Binder 缓存区只有大约 1MB 且是全局共享的。如果你的图库应用中,用户点击一张 5M 或更高分辨率的手机照片,直接用 Intent 传 Bitmap 会瞬间引发线上直接闪退。

一、同一进程传递大数据

1. 使用内存全局单例缓存桥接

既然两个 Activity 运行在同一个进程(JVM 堆内存共享)中,最完美的做法就是:不要把图片放进 Intent,只在 Intent 里传递一个轻量级的字符串(Key),图片数据暂存在内存单例中。

建立内存桥接

import android.graphics.Bitmap object ImageBridge { // 使用 HashMap 暂存大图,支持同时处理多个转场大图 private val imageCache = HashMap<String, Bitmap>() private const val IMAGE_KEY = "gallery_image_key_" /** * 将大图存入内存桥接仓,并返回一个唯一 Key */ fun putImage(bitmap: Bitmap): String { val key = "$IMAGE_KEY${System.currentTimeMillis()}" imageCache[key] = bitmap return key } /** * 取出大图,并自动将其从缓存中抹除,防止内存泄漏 */ fun popImage(key: String?): Bitmap? { if (key == null) return null return imageCache.remove(key) // remove 会返回对应的值并从 map 中彻底干掉 } }

发起跳转页面

val intent = Intent(this@MainActivity, SharedMemoryActivity::class.java) val bitmap = BitmapFactory.decodeResource(resources, R.drawable.aa) val imageKey = putImage(bitmap) intent.putExtra("KEY_IMAGE_BRIDGE", imageKey) startActivity(intent)

接收数据页面

val imageKey = intent.getStringExtra("KEY_IMAGE_BRIDGE") val largeBitmap = ImageBridge.popImage(imageKey) LogUtils.d(TAG, "largeBitmap width=${largeBitmap?.width} height =${largeBitmap?.height}")

2.使用路径传递

将图片数据保存到应用目录下,再拿保存的路径去听过intent去传递

suspend fun saveBitmapToCache(context: Context, bitmap: Bitmap): String? = withContext( Dispatchers.IO ) { // 1. 在 cache 目录下建立临时中转沙盒文件 val cacheDir = File(context.cacheDir, "image_bridge") if (!cacheDir.exists()) { cacheDi
http://www.jsqmd.com/news/1031491/

相关文章:

  • 电动车不拆电池能发的物流有哪些?选对专线是关键 - 快递物流资讯
  • DeepSeek-V3 模型量化部署优化指南:从671B参数到消费级GPU的降本增效实践
  • 我用 ChatGPT 辅助写代码后,效率提升最大的 5 个场景
  • 网络与硬件故障排查实战:从netstat命令到设备状态监控
  • 销量暴跌 57%!《每周工作 4 小时》作者血泪自剖:AI 正在杀死知识付费与工具书
  • 国内主流计量泵厂家盘点 聚焦行业核心选型维度 - 奔跑123
  • 西安变速箱维修怎么选?三桥星动力动力源传动全方位深度评测 - 资讯纵览
  • 2026年朝阳区汽车变速箱维修,北京南城变速箱维修标杆!北京达意城兴城汽车服务中心深耕 25 年,王波总监专修全类型变速箱、混动减速器,透明维修杜绝行业套路 - 资讯纵览
  • 如何用IOPaint实现专业级AI图像修复?深度解析PowerPaint V2核心技术
  • GLM-5.2上线并开源?API价格太高?GLM-5.2专注Coding与长程任务|深度解析
  • 当贝Air1S新品耳夹耳机解析,各项核心配置逐一盘点
  • 5个理由让你选择Portkey AI Gateway:统一接入1600+AI模型的最佳开发工具
  • AI驱动的PDF转PPT技术解析:从“格式搬运”到“内容重构”的5款主流AI工具对比
  • LunaTranslator:打破语言障碍,畅享视觉小说世界的终极翻译工具
  • 2026 年免费 AI 配音工具综合测评排行榜
  • 2026年国内内污水处理设备定制厂家:刮泥机、沉淀池源头厂家盘点 - 栗子测评
  • Qt配置环境(海康相机,PI电机)
  • 鸿蒙用 Form Kit 做“今日推荐“,为什么比单纯应用内推荐更有说服力
  • BlenderMCP:基于MCP协议的AI驱动3D建模架构解析与部署指南
  • 真空石墨炉选型白皮书:真空石墨炉哪个厂家口碑好?从温场均匀性、极限真空度与热区尺寸全解析 - 品牌推荐大师1
  • 终极指南:用AI语音控制Blender,零代码完成3D建模
  • 2026 年天津 GEO 优化公司综合实力推荐榜:AI 生成搜索时代企业选型客观评测指南 - GrowthUME
  • 计算机毕业设计之奥运会志愿者管理系统
  • 即时注入攻击
  • 打造私域闭环:CRM 如何驱动企微外部客户触达
  • 2026年惠州GEO服务商口碑精选,这5家表现稳健 - 阿威说AI
  • Linux命令行工作流构建:从基础操作到自动化实战
  • Moonlight-Switch:让任天堂Switch变身PC游戏串流终端的完整指南
  • 如何管理WPS 2019的稻壳商城显示?一键关闭与快速开启指南
  • 2026年天津武清挖掘机租赁推荐:5家设备可靠的租赁公司 - 本地品牌推荐