Android Glide 图片加载库的简单用法

90 阅读5分钟

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 会自动清理,无需手动调用
}

九、与其他图片库对比

特性维度GlidePicassoFrescoCoil
包体积约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 平台上功能最全面、性能最优的图片加载库之一,特别适合需要处理大量图片、支持多种图片格式、对性能要求高的应用。通过合理的配置和使用,可以显著提升应用的图片加载体验和内存效率。

  • 使用建议:
  1. 对于简单的图片加载需求,使用默认配置即可
  2. 对于列表等需要大量加载图片的场景,注意优化缓存策略
  3. 对于特殊格式(GIF、WebP等),充分利用 Glide 的特性
  4. 及时更新到最新版本,获取性能改进和新特性