图片加载优化+glide配置 浅谈
图片加载优化笔记1. Bitmap 基础图片文件jpg/png/webp磁盘上的压缩文件。Bitmap图片文件在内存中的解码后像素图可理解为画布信息宽高、像素格式等像素数组决定最终显示内容1.1 像素格式与内存占用ARGB_8888A/R/G/B 各 8 bit合计 (888832) bit 4 字节/像素RGB_565R/G/B 为 5/6/5 bit合计 (56516) bit 2 字节/像素1.2 为什么会 OOM / 卡顿任何图片显示流程都绕不开从磁盘/网络读取压缩文件解码成 Bitmap内存中的像素图绘制到屏幕优化重点通常在「减少解码后的 Bitmap 内存占用」以及「复用 Bitmap 相关对象」避免频繁创建/销毁导致的内存抖动与 GC。2. Glide 配置通过继承AppGlideModuleGlide 通常通过自定义AppGlideModule来做全局配置核心关注点是缓存策略、解码格式、组件替换。2.1applyOptions()配置缓存与解码格式在applyOptions(Context, GlideBuilder)中对 builder 进行配置常见点setBitmapPool(...)缓存/复用 Bitmap 的“画布”像素承载容器目的减少 Bitmap 频繁创建与销毁降低内存抖动setMemoryCache(...)缓存已经“画好像素”的 Bitmap目的下次命中时更快显示setDecodeFormat(...)设置默认解码格式RGB 或 ARGB一般来说RGB_565 内存占用约为 ARGB_8888 的一半Glide 也可能根据图片是否有透明通道自动选择有透明度更倾向 ARGB结论当你需要加载大量网络/本地图时合理选择解码格式能明显降低内存压力2.2registerComponents()替换网络/解码组件在registerComponents(Context, Glide, Registry)里可以替换或插入组件实现自定义的数据加载与解码链路。Registry 常见注册方式append(...)追加到后面prepend(...)插队优先匹配replace(...)直接替换默认实现常用注册签名语义registry.xxx(ClassData dataClass, ClassResource resourceClass, Factory factory)dataClass输入类型/源头File、InputStream、GlideUrl、String、Uri等resourceClass目标类型Bitmap、Drawable、InputStream等factory具体干活的工厂ModelLoader.Factory、Decoder.Factory、Encoder.Factory等3. Android Q 前后缩略图加载差异3.1 Android Q10以下常见做法glide.load(Uri.fromFile(File(path)))这通常会读原图并解码到内存再按目标尺寸进行缩放若使用thumbnail(0.1f)Glide 会做两件事先加载 10% 的缩略图下采样用于快速展示后台加载清晰图完成后替换3.2 Android Q10及以上系统缩略图能力系统会为媒体资源生成并缓存不同规格的缩略图存到磁盘MICRO_KIND小缩略图约96×96MINI_KIND中等缩略图约512×384最长边不超过 512FULL原图补充规则如果原图本身小于缩略图尺寸系统可能不生成缩略图。优化点在列表/小图场景优先加载系统缩略图可以显著提升首屏加载速度与滚动流畅度。4. Android Q 如何“用 Glide 加载系统缩略图”思路自定义一个 Loader让 Glide 在加载Uri/ContentUri时走ContentResolver.loadThumbnail(...)。实现要点自定义ModelLoader在ModelLoader中提供一个DataFetcher内部类实现即可在DataFetcher.loadData(...)中调用contentResolver.loadThumbnail(...)获取缩略图在AppGlideModule.registerComponents()中把这个 Loader 注册进去用prepend/replace视优先级决定5. FileUri vs ContentUriAndroid Q 以下访问图片常可直接使用FileUriAndroid Q 及以上更多情况下只能通过ContentUri访问媒体资源受分区存储等限制结论做图片加载兼容/优化时需要同时考虑资源标识FileUri / ContentUri是否能利用系统缩略图Q解码格式与缓存策略BitmapPool / MemoryCache / DecodeFormat