

安卓图片展示可通过ImageView组件实现,支持本地、网络及资源文件加载,常用Glide/Picasso库优化加载,需配置存储/网络权限,注意内存缓存与图片压缩,适配不同分辨率屏幕
主流图片加载库对比
Glide
特性 |
说明 |
依赖体积 |
轻量级(核心库约400KB) |
功能支持 |
GIF动态图、WebP、缩略图生成、图片转换(如圆角/模糊) |
缓存机制 |
自动管理内存+磁盘缓存,支持自定义策略 |
线程管理 |
内部封装线程池,无需手动处理 |
适配场景 |
通用场景首选,尤其适合列表/网格视图高频加载 |
Picasso
特性 |
说明 |
依赖体积 |
更轻量(核心库约200KB) |
功能支持 |
基础加载、圆角处理、模糊滤镜,不支持GIF/WebP |
缓存机制 |
仅内存缓存,需配合OkHttp实现磁盘缓存 |
线程管理 |
自动异步加载,支持优先级队列 |
适配场景 |
简单需求或对包体积敏感的场景 |
Fresco
特性 |
说明 |
依赖体积 |
较大(核心库约700KB),但支持分模块引入 |
功能支持 |
支持大图(超过2GB)、GIF、WebP、渐进式加载、动画 |
缓存机制 |
独立Bitmap缓存+二级磁盘缓存,支持跨进程共享缓存 |
线程管理 |
基于Choreographer实现精准渲染调度 |
适配场景 |
复杂动效、大图展示、需要跨进程共享缓存的场景 |
图片缓存机制解析
内存缓存
- 实现原理:基于LRU算法(最近最少使用)淘汰策略
- 默认配置:Glide/Fresco自动分配heap size的1/8作为缓存上限
- 优化建议:
- 高频加载场景可提升至1/6(需警惕OOM风险)
- 低频场景可降低至1/10节省内存
磁盘缓存
类型 |
存储位置 |
适用场景 |
内部存储 |
/data/data/包名/cache |
无需申请权限,数据易清理 |
外部存储 |
/sdcard/Android/data/ |
持久化存储,需申请读写权限 |
应用私有目录 |
getFilesDir() |
安全存储,生命周期绑定应用 |
图片展示优化策略
图片压缩
// Glide压缩示例
Glide.with(context)
.load(url)
.override(400, 200) // 强制尺寸
.fitCenter() // 保持比例裁剪
.encodeFormat(Bitmap.CompressFormat.WEBP) // 优先使用webp格式
.into(imageView);
异步加载优化
// Picasso异步监听
Picasso.get()
.load(url)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
// 加载成功逻辑
}
@Override
public void onError(Exception e) {
// 失败重试逻辑
}
});
RecyclerView图片复用
<!-item布局关键属性 -->
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:tag="glide_cache_key"/> <!-标记防止重复加载 -->
常见问题与解决方案
问题1:图片加载导致OOM
- 原因分析:未做尺寸压缩,直接加载原始大图
- 解决方案:
- 使用
.override()
限制显示尺寸
- 启用
.dontAnimate()
减少临时对象创建
- 配置
.memorySize()
合理设置缓存上限
问题2:列表滑动时图片闪烁
- 原因分析:复用机制失效,频繁重新解码
- 解决方案:
- 添加唯一标识
android:tag
防止重复加载
- 使用
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
优化缓存命中
- 开启Fresco的
Stetho
调试工具监控缓存状态
【相关问题解答】
Q1:如何选择Glide/Picasso/Fresco?
- 场景化建议:
- 基础需求:Picasso(最小化包体积)
- 复杂动效:Fresco(支持帧动画+跨进程缓存)
- 通用场景:Glide(平衡功能与性能)
Q2:如何处理WebP格式图片?
- 支持方案:
- 确保设备系统支持(Android 4.0+)
- 调用
.encodeFormat(Bitmap.CompressFormat.WEBP)
强制转换
- 搭配
.fallback(R.drawable.jpeg_fallback)
兼容