Glide 是 Google 推荐的 Android 图片加载库,专注于流畅的滚动和高效的内存管理。
一、主要特点
- 简单易用:链式调用,API简洁
- 性能优异:自动缓存,内存管理智能
- 功能丰富:支持GIF、视频缩略图、图片变换等
- 生命周期感知:自动管理请求生命周期
二、基本使用
1. 添加依赖
dependencies {
implementation 'com.github.bumptech.glide:glide:4.16.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
}
2. 基本加载
// 基本用法
Glide.with(context)
.load(url)
.into(imageView);
// 加载资源
Glide.with(context)
.load(R.drawable.image)
.into(imageView);
// 加载文件
Glide.with(context)
.load(new File(path))
.into(imageView);
三、核心功能详解
1. 占位符和错误处理
Glide.with(context)
.load(url)
.placeholder(R.drawable.placeholder) // 加载中显示
.error(R.drawable.error) // 加载失败显示
.fallback(R.drawable.fallback) // 数据为 null 时显示
.into(imageView);
2. 图片变换
// 圆形图片
Glide.with(context)
.load(url)
.circleCrop()
.into(imageView);
// 圆角图片
Glide.with(context)
.load(url)
.transform(new RoundedCorners(16))
.into(imageView);
// 自定义变换
public class BlurTransformation extends BitmapTransformation {
@Override
protected Bitmap transform(@NonNull BitmapPool pool,
@NonNull Bitmap toTransform,
int outWidth, int outHeight) {
// 实现模糊变换
return blurBitmap(toTransform);
}
}
3. 缓存策略
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始数据和转换后数据
.into(imageView);
// 缓存策略选项:
// DiskCacheStrategy.NONE 不缓存
// DiskCacheStrategy.DATA 只缓存原始图片
// DiskCacheStrategy.RESOURCE 只缓存转换后的图片
// DiskCacheStrategy.ALL 缓存所有版本
// DiskCacheStrategy.AUTOMATIC 自动选择
4. 缩略图
// 先加载缩略图,再加载原图
Glide.with(context)
.load(url)
.thumbnail(0.1f) // 原图的10%大小
.into(imageView);
// 用另一个请求作为缩略图
Glide.with(context)
.load(url)
.thumbnail(Glide.with(context).load(thumbnailUrl))
.into(imageView);
四、高级功能
1. 监听加载状态
Glide.with(context)
.load(url)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e,
Object model,
Target<Drawable> target,
boolean isFirstResource) {
// 处理加载失败
return false;
}
@Override
public boolean onResourceReady(Drawable resource,
Object model,
Target<Drawable> target,
DataSource dataSource,
boolean isFirstResource) {
// 处理加载成功
return false;
}
})
.into(imageView);
2. 自定义模块
// 创建自定义模块
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(@NonNull Context context,
@NonNull GlideBuilder builder) {
// 自定义配置
builder.setDefaultRequestOptions(
new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
);
}
@Override
public void registerComponents(@NonNull Context context,
@NonNull Glide glide,
@NonNull Registry registry) {
// 注册自定义组件
}
}
3. 加载gif
// 加载 GIF
Glide.with(context)
.asGif()
.load(gifUrl)
.into(imageView);
// 只显示第一帧
Glide.with(context)
.asBitmap()
.load(gifUrl)
.into(imageView);
4. 生命周期管理
// Glide 自动管理生命周期
Glide.with(activity) // 与 Activity 生命周期绑定
Glide.with(fragment) // 与 Fragment 生命周期绑定
Glide.with(view) // 与 View 生命周期绑定
Glide.with(context) // 与应用生命周期绑定
五、内存优化
1. 内存缓存配置
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 设置内存缓存大小
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
.setMemoryCacheScreens(2)
.build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
// 设置 Bitmap 池大小
builder.setBitmapPool(new LruBitmapPool(calculator.getBitmapPoolSize()));
}
}
2. 清理缓存
// 清理内存缓存(主线程)
Glide.get(context).clearMemory();
// 清理磁盘缓存(子线程)
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();
}
}).start();
六、网络集成
1. 使用okhttp
dependencies {
implementation 'com.github.bumptech.glide:okhttp3-integration:4.16.0'
}
2. 自定义网络栈
@GlideModule
public class OkHttpLibraryGlideModule extends LibraryGlideModule {
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new MyInterceptor())
.build();
registry.replace(GlideUrl.class, InputStream.class,
new OkHttpUrlLoader.Factory(client));
}
}
七、常见问题解决
1. 图片变形问题
// 使用 centerCrop 或 fitCenter
Glide.with(context)
.load(url)
.centerCrop() // 填充,可能裁剪
.fitCenter() // 适应,可能留白
.into(imageView);
2. 加载大图OOM
// 使用 override 限制尺寸
Glide.with(context)
.load(url)
.override(800, 600) // 限制最大尺寸
.into(imageView);
3. Recycleview中重复加载
// 在 RecyclerView.Adapter 中
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// 清除之前的请求
Glide.with(context).clear(holder.imageView);
// 发起新请求
Glide.with(context)
.load(url)
.into(holder.imageView);
}
八、最佳实践
1. 图片加载优化
// 使用恰当的图片格式
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565) // 减少内存占用
.disallowHardwareConfig(); // 兼容性更好
Glide.with(context)
.load(url)
.apply(options)
.into(imageView);
2. 避免内存泄露
// 在合适的时机暂停请求
@Override
protected void onPause() {
super.onPause();
Glide.with(this).pauseRequests();
}
@Override
protected void onResume() {
super.onResume();
Glide.with(this).resumeRequests();
}
// 在销毁时清理
@Override
protected void onDestroy() {
super.onDestroy();
// Glide 会自动清理,无需手动调用
}
九、与其他图片库对比
| 特性维度 | Glide | Picasso | Fresco | Coil |
|---|---|---|---|---|
| 包体积 | 约500KB | 约100KB | 约2-3MB | 约300KB |
| 支持的图片格式 | 图片、GIF、WebP、适配缩略图 | 图片、WebP | 图片、GIF、WebP、渐进式JPEG | 图片、GIF、WebP、SVG等 |
| 内存管理与缓存 | 自动复用Bitmap,内存友好,支持磁盘缓存 | 简单缓存,依赖OKHttp实现磁盘缓存 | 三级缓存 | 支持内存与磁盘缓存,自动暂停/取消请求 |
| 易用性与API | 链式调用,与Activity/Fragment生命周期绑定,集成度高 | API极其简洁,上手快 | 需初始化,使用专属SimpleDraweeView,用法最复杂 | Kotlin优先,大量使用扩展函数,API现代简洁 |
-
追求全面均衡,选择 Glide
- 优点:功能全面(GIF、视频),性能好,与生命周期绑定,社区资源丰富,是经久不衰的“水桶型”选择
- 缺点:APK体积增加相对明显。
- 适合:绝大多数应用,特别是需要加载GIF或与列表滚动结合紧密的场景。
-
追求极简与快速集成,选择 Picasso
- 优点:API最简单,集成最快,包体积小。
- 缺点:功能单一(不支持GIF),内存和缓存策略相对基础。
- 适合:小型应用或原型开发,只需加载静态图片且对包大小敏感。
-
追求极致性能与大型图片处理,选择 Fresco
- 优点:内存管理能力最强(尤其是低端机),支持渐进式加载,对大图、长图处理有优势。
- 缺点:库体积最大,API复杂,有侵入性(需使用特定View)。
- 适合:图片密集型应用(如社交、壁纸类),尤其需要关注低端机上的性能表现。
-
追求现代与轻量,选择 Coil
- 优点:为Kotlin和协程量身打造,API流畅,轻量,符合现代Android开发趋势。
- 缺点:较新,社区生态和深度定制方案相对Glide较少。
- 适合:Kotlin项目,尤其是新项目,希望采用更现代的异步架构。
十、总结
Glide 是 Android 平台上功能最全面、性能最优的图片加载库之一,特别适合需要处理大量图片、支持多种图片格式、对性能要求高的应用。通过合理的配置和使用,可以显著提升应用的图片加载体验和内存效率。
- 使用建议:
- 对于简单的图片加载需求,使用默认配置即可
- 对于列表等需要大量加载图片的场景,注意优化缓存策略
- 对于特殊格式(GIF、WebP等),充分利用 Glide 的特性
- 及时更新到最新版本,获取性能改进和新特性