Android 加载大图策略

张开发
2026/4/18 7:12:27 15 分钟阅读

分享文章

Android 加载大图策略
Android 加载大图策略喜欢我就关注我吧,爱你哟,文章最下面附有github仓库。在 App 里加载大图,核心问题并不是“能不能显示出来”,而是:如何在有限内存、有限带宽、有限主线程时间里,把用户需要看到的那部分图片,尽快且稳定地显示出来。很多大图问题,本质上都会表现为下面几种现象:页面打开很慢滑动列表时卡顿图片解码时内存暴涨出现OOM(OutOfMemoryError)明明图片已经下载了,但展示依然不流畅所以说,大图加载策略的本质是一个综合方案,它同时涉及:图片压缩与解码内存管理磁盘缓存网络传输UI 渲染时机图片库调度策略1. 为什么大图会成为问题先看一个最容易被忽略的事实:图片文件体积小,不代表解码后的内存占用也小。比如一张4000 x 3000的图片,即使磁盘上只有几 MB,解码成 Bitmap 后,内存占用可能非常大。如果按常见的ARGB_8888配置计算:每个像素 4 字节4000 x 3000 = 12000000像素总内存约12000000 x 4 = 48MB也就是说,一张图解码后就可能吃掉几十 MB 内存。如果页面上同时出现多张图,或者列表快速滑动导致短时间内频繁创建 Bitmap,就很容易出现:Java 堆内存紧张频繁 GC主线程掉帧最终 OOM所以大图加载的第一原则不是“原图直接显示”,而是:显示尺寸决定解码尺寸,而不是图片原始尺寸决定解码尺寸。2. 大图加载到底经历了什么从流程上看,一张图片从来源到显示,大致会经过下面几个阶段:文件/网络 - 读取字节流 - 解码为 Bitmap - 放入内存/磁盘缓存 - 交给 ImageView/Compose 绘制这里面最耗资源的通常有三步:网络下载或磁盘读取图片解码主线程参与的 UI 刷新其中真正最容易引发内存问题的是:把大图完整解码成 Bitmap。因为只要一旦完整解码,内存占用就已经发生了,后面再怎么缩放显示,都晚了。所以优化关键点一定是:解码前先拿到图片尺寸按目标显示尺寸采样避免一次性解码整张超大图3. 常见大图场景有哪些不同场景,大图策略并不完全一样。3.1 列表缩略图比如信息流、商品列表、相册列表。这类场景特点是:屏幕上同时有很多图单张图展示区域通常不大滑动频繁,对流畅度要求高所以这里最重要的是:小尺寸采样解码强缓存

更多文章