结合实例讲解Glide在Android开发中从初级到高级各种用法

2025-03-06 17:11 结合实例讲解Glide在Android开发中从初级到高级各种用法已关闭评论

以下是从初级到高级的 Glide 在 Android 开发中的全面用法解析,结合实例代码和场景说明,帮助开发者灵活应对不同需求。


初级用法:基础图片加载

1. 加载网络图片

Glide.with(context)
    .load("https://example.com/image.jpg")
    .into(imageView)
  • 作用:将网络图片异步加载到 ImageView,自动处理图片尺寸适配。

2. 加载本地资源

Glide.with(context)
    .load(R.drawable.local_image)
    .into(imageView)
  • 作用:加载 res/drawableassets 中的本地图片。

3. 占位符与错误图

Glide.with(context)
    .load(url)
    .placeholder(R.drawable.placeholder) // 加载中的占位图
    .error(R.drawable.error)            // 加载失败的占位图
    .fallback(R.drawable.fallback)      // 当模型为 null 时的占位图
    .into(imageView)

中级用法:进阶配置与优化

1. 图片变换(Transformation)

// 内置变换:圆角、裁剪等
Glide.with(context)
    .load(url)
    .transform(CircleCrop(), RoundedCorners(16)) // 圆形 + 圆角
    .into(imageView)

// 自定义变换(如高斯模糊)
class BlurTransformation : BitmapTransformation() {
    override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
        return blurBitmap(toTransform) // 实现模糊算法
    }
    // 唯一标识变换的 Key
    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        messageDigest.update("blur_transformation".toByteArray())
    }
}

// 使用自定义变换
Glide.with(context)
    .load(url)
    .transform(BlurTransformation())
    .into(imageView)

2. 缓存策略控制

// 跳过内存缓存
Glide.with(context)
    .load(url)
    .skipMemoryCache(true) // 仅跳过内存缓存
    .into(imageView)

// 仅从缓存加载(无缓存则失败)
Glide.with(context)
    .load(url)
    .onlyRetrieveFromCache(true)
    .into(imageView)

// 磁盘缓存策略(默认:自动选择缓存类型)
Glide.with(context)
    .load(url)
    .diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始数据 + 转换后的资源
    .into(imageView)

3. 加载监听与回调

Glide.with(context)
    .load(url)
    .listener(object : RequestListener<Drawable> {
        override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
            // 处理加载失败
            return false // 返回 true 表示已处理,不触发 error 占位符
        }

        override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
            // 图片加载完成
            return false
        }
    })
    .into(imageView)

高级用法:深度定制与性能优化

1. 自定义 GlideModule(替换网络层为 OkHttp)

// 步骤1:添加依赖
implementation 'com.github.bumptech.glide:okhttp3-integration:4.12.0'

// 步骤2:创建自定义 GlideModule
@GlideModule
class MyAppGlideModule : AppGlideModule() {
    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor { chain ->
                // 添加统一请求头
                val request = chain.request().newBuilder()
                    .header("User-Agent", "MyApp")
                    .build()
                chain.proceed(request)
            }
            .build()
        registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(okHttpClient))
    }

    override fun applyOptions(context: Context, builder: GlideBuilder) {
        // 配置内存缓存大小(默认:设备内存的 1/8)
        builder.setMemoryCache(LruResourceCache(1024 * 1024 * 100)) // 100MB
    }
}

2. 加载 GIF 并控制播放

// 加载 GIF(默认自动播放)
Glide.with(context)
    .load("https://example.com/animation.gif")
    .into(imageView)

// 手动控制 GIF 播放
val gifDrawable = Glide.with(context)
    .asGif()
    .load(gifUrl)
    .submit() // 返回 FutureTarget<GifDrawable>

// 开始播放
gifDrawable.get().start()

// 停止播放
gifDrawable.get().stop()

3. 加载缩略图(Thumbnail)

// 同时加载原图和缩略图(快速显示低分辨率图)
Glide.with(context)
    .load(url)
    .thumbnail(0.1f) // 原图 10% 的缩略图
    .into(imageView)

// 先加载其他图片作为缩略图
Glide.with(context)
    .load(url)
    .thumbnail(
        Glide.with(context)
            .load(thumbnailUrl)
    )
    .into(imageView)

4. 资源回收与复用

// 手动释放 Glide 内存(在 onTrimMemory 中调用)
Glide.get(context).clearMemory()

// 复用 BitmapPool 优化内存
Glide.with(context)
    .load(url)
    .apply(RequestOptions.bitmapTransform(object : BitmapTransformation() {
        override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
            // 从 BitmapPool 复用 Bitmap
            val reusedBitmap = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888)
            // 处理图片并返回
            return processBitmap(reusedBitmap)
        }
    }))
    .into(imageView)

场景化解决方案

1. 列表滑动优化

// RecyclerView 的 onScrollStateChanged 中控制加载
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        when (newState) {
            RecyclerView.SCROLL_STATE_DRAGGING -> Glide.with(context).pauseRequests()
            RecyclerView.SCROLL_STATE_IDLE -> Glide.with(context).resumeRequests()
        }
    }
})

2. 大图加载优化(如长图、高清图)

// 使用 override 限制加载尺寸
Glide.with(context)
    .load(url)
    .override(1000, 1000) // 限制为 1000x1000 像素
    .into(imageView)

// 结合 SubsamplingScaleImageView(第三方库)
Glide.with(context)
    .load(url)
    .into(object : CustomTarget<Bitmap>() {
        override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
            subsamplingScaleImageView.setImage(ImageSource.bitmap(resource))
        }
    })

3. 图片加载优先级

// 设置加载优先级(Priority.IMMEDIATE > HIGH > NORMAL > LOW)
Glide.with(context)
    .load(highPriorityUrl)
    .priority(Priority.HIGH)
    .into(imageView)

总结与最佳实践

场景 推荐用法 优化点
常规图片加载 基础加载 + 占位符 使用 diskCacheStrategy
列表滑动 暂停/恢复请求 + 缩略图 结合 RecyclerView 滚动监听
大图或高清图 override 限制尺寸 + 第三方库支持 避免内存溢出(OOM)
定制化需求 自定义 GlideModule + Transformation 替换网络层、扩展解码器
性能敏感场景 复用 BitmapPool + 内存缓存调优 减少 GC 频率

调试技巧
- 开启详细日志:adb shell setprop log.tag.Glide VERBOSE
- 检查缓存命中:通过 Debug 包查看 MemoryCacheDiskCache 状态。

当前文章价值6.39元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3776.html ,谢谢支持!

资源分享

分类:glide 标签:
基于markdown文章内容,使用Python提取markdown文章关键字的具体实现 基于markdown文章内容,使用Pyt
Android SDK “Error when loading the SDK” Android SDK “Error when
python库pyQt语法用例介绍 python库pyQt语法用例介绍
什么是避孕? 什么是避孕?

评论已关闭!