Glide — 是一个用于在Android中加载图片的库,由Google通过Bumptech项目提供支持。该库通过自动内存管理实现了高效的图片、GIF动画和视频帧加载。根据Glide的GitHub仓库数据,该项目被超过20万个应用使用。Google推荐Glide作为Android中加载图形的首选库。
要点
Glide — 是一个用于在Android应用中快速高效加载图片、动画GIF和视频帧的库。该项目由Bumptech在Google支持下开发,并广泛用于Google的官方应用中。
Glide的内部架构基于组件化方法:Engine管理请求的执行,DecodeJob负责解码,ResourceDecoder将原始数据转换为Bitmap或Drawable。每个阶段都可以通过模块和注册表进行自定义,这使得Glide成为处理非标准图片格式的极其灵活的库。
与许多竞争对手不同,Glide从一开始就考虑到了Android的特性而设计:Activity和Fragment的生命周期、屏幕旋转、配置变更。该库根据组件的状态自动暂停和恢复加载。
根据Android Developers,Glide是Google官方文档中推荐的图片加载库。它被用于Google Play、Google Maps以及该公司的其他产品中,这证实了其可靠性和性能。
Glide与同类产品的关键区别在于 — 将图片自动缩放到ImageView的大小。如果Picasso以完整分辨率加载图片然后进行缩放,Glide则直接在所需大小下解码文件。这降低了峰值内存消耗,并加速了在具有不同单元格大小的列表中的显示。
Glide提供了广泛的图片处理功能,涵盖了简单和复杂的内容加载场景。
GIF和动画WebP在Glide中加载和显示就像静态图片一样简单。该库根据MIME类型自动检测格式并解码动画,在后台线程中显示帧。用于控制播放的方法有asGif和asBitmap。
Glide自动绑定到Activity、Fragment和View的生命周期。当Activity暂停时加载会暂停,当销毁时会取消。这防止了内存泄漏和为已关闭屏幕加载图片。集成通过LifecycleOwner支持实现。
Glide可以根据URL或本地路径从视频中提取帧。为此,使用asBitmap()方法与视频URI的load()结合使用。Glide自动选择关键帧或根据指定时间戳选择帧。这对于显示视频预览很有用。
GlideApp — 是一个基于AppGlideModule配置生成的类,提供扩展的API。通过它可以使用的标准Glide.with中不可用的方法:使用自定义默认选项加载、集成库和预设变换。生成需要在继承AppGlideModule的类中添加@GlideModule注解。
Glide使用多层架构,包含引擎、解码器、变换和缓存。每个请求都经过处理程序链,为特定的ImageView优化加载。
当调用into(view)时,Glide检查缓存:活动资源、RAM缓存、磁盘缓存,然后才是网络。图片会自动缩放到目标ImageView的大小,同时考虑屏幕密度和scaleType。这减少了内存使用 — 这是Glide的关键优势。
Glide.with(context)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.override(400, 300)
.centerCrop()
.into(imageView)
安装 Glide通过Gradle进行。该库需要通过AppGlideModule进行配置以生成API。最低Android API版本 — 21。
在build.gradle中添加Glide以及kapt注解处理器以生成GlideApp API。对于Kotlin,使用kapt而不是annotationProcessor。Glide 4.16+版本与Android Gradle Plugin 8.x稳定兼容。
dependencies {
implementation "com.github.bumptech.glide:glide:4.16.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.16.0"
}
// 对于Kotlin,请使用kapt
// kapt "com.github.bumptech.glide:compiler:4.16.0"
AppGlideModule — 配置Glide的必需组件。它允许设置缓存大小、自定义HttpStack和注册自己的解码器。该模块在应用启动时由Glide扫描。@GlideModule注解会自动注册它。
@GlideModule
public class MyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSize = 250 * 1024 * 1024;
builder.setDiskCache(
new DiskLruCacheFactory(cacheDir.getPath(), diskCacheSize)
);
}
}
示例下面展示了典型场景:加载图片、使用GIF和提取视频帧。
通过Glide.with().load().into()进行基本加载 — 从网络显示图片的最小代码。Glide自动调整ImageView的大小。占位符在加载期间显示,错误时显示error图片。
Glide.with(fragment)
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
GIF像静态图片一样加载 — Glide根据内容类型自动检测格式。如需强制加载为静态图片,使用asBitmap();对于GIF,使用asGif()。Glide仅高效解码可见帧。
Glide.with(context)
.asGif()
.load("https://example.com/animation.gif")
.into(imageView)
// 将GIF的第一帧作为静态图像加载
Glide.with(context)
.asBitmap()
.load("https://example.com/animation.gif")
.into(imageView)
视频帧由Glide根据本地或远程视频的URI提取。默认情况下,Glide加载关键帧。如需指定特定时间戳,使用frameMillis。这便于在视频画廊中显示预览。
String videoUrl = "https://example.com/video.mp4";
Glide.with(context)
.asBitmap()
.load(videoUrl)
.override(200, 200)
.into(imageView)
优化 Glide for RecyclerView — 开发包含大量图片的应用时的关键技能。正确的配置可以防止卡顿和OOM错误。
Glide的关键功能之一 — 通过RecyclerViewPreloader与RecyclerView集成。该组件分析滚动速度和移动方向,预加载将在几个元素后出现在屏幕上的图片。使用预加载器需要实现PreloadSizeProvider接口,并将其与目标ImageView一起传递给构造函数。
使用带有精确ImageView尺寸的override()方法可以显著加速加载。当Glide知道目标的精确大小时,它可以直接在所需分辨率下解码图片,跳过缩放阶段。这缩短了解码时间,并将峰值内存消耗降低30–40%。
对于具有异构内容的列表,为每种元素类型使用不同的RequestOptions。例如,对于大型横幅图片,可以设置override(1200, 600)和RGB_565质量,而对于头像 — override(200, 200)和通过transform进行圆角处理。这种方法允许为每种内容类型优化使用资源。
Glide通过error图片和自定义RequestListener提供了灵活的错误处理能力。RequestListener允许对成功加载或错误做出反应,记录故障或发送分析数据。还可以配置fallback — 当load()收到null而非链接时显示的图片。
使用RecyclerViewPreloader在用户滚动到图片之前预加载它们。Glide通过分析滚动速度并提前加载图片的预加载器支持与RecyclerView的集成。
Thumbnail倍数允许先显示图片的缩小版本,然后加载完整版本。调用thumbnail(0.25f)加载25%大小的版本,立即显示,而完整大小的图片稍后加载。这创造了即时加载的感觉。
对于列表适配器,使用具有精确ImageView尺寸的.override(),这样Glide就不必每次都缩放图片。这减少了CPU负载和内存消耗。缓存大小通过实验选择,但磁盘250 MB和可用内存的20%是一个良好的起点。
常见问题解答
Glide支持GIF、视频帧和动画WebP。它更高效地管理内存,并被Google推荐。Picasso更小且更易于使用。对于复杂项目,请选择Glide。
Glide接受LifecycleOwner(Fragment、Activity)或View。该库通过LifecycleObserver自动跟踪状态:在暂停时停止加载,在销毁时取消加载,防止泄漏。
可以,在load()之前使用asBitmap()。Glide会将GIF作为静态图片加载,并仅显示第一帧。这对于在列表中由于性能原因不希望播放GIF动画的情况很有用。
缓存 Glide由三个级别组成:活动资源(正在使用)、RAM(LRU缓存)和磁盘(LruCache)。从缓存加载的图片会立即显示。当内存不足时,缓存会自动清理。
自定义 HTTP客户端通过AppGlideModule中的OkHttpUrlLoader注册。重写registerComponents并注册自己的OkHttpClient。这允许添加拦截器、证书和自定义超时。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。