Glide

1、Glide 是什么?

答案

Glide 是 Google 推荐的 Android 图片加载框架,专注图片加载、缓存、压缩、内存管理、生命周期绑定;

支持网络图片、本地图片、GIF、视频缩略图,默认内存占用低、适配生命周期、自动回收

2、Glide 优势 对比 Picasso

答案

  1. 生命周期绑定:自动跟随 Activity/Fragment 生命周期,页面销毁自动暂停请求、释放内存,防泄漏。
  2. 三级缓存:内存缓存、磁盘缓存、资源缓存。
  3. 自动压缩 :根据 ImageView 大小自动适配采样率,减少内存占用。
  4. 支持 GIF、视频缩略图
  5. 加载速度更快、弱网表现好、内存优化更强。
  6. 可配置优先级、预加载、缩略图、变换裁剪。

3、Glide 四级缓存原理

Glide 是四级缓存 ,优先级从上到下:活跃缓存 → 内存缓存 → 磁盘缓存 → 网络

1. 活跃缓存(Active Resources)
  • 正在当前页面显示、被引用的 Bitmap
  • 从内存缓存取出后放入这里
  • 优先级别最高,正在用的图片不被 Lru 回收
2. 内存缓存(LruCache 内存)
  • Lru 最近最少使用算法
  • 存放近期用过、暂时没显示的图片
  • 读取极快,App 在内存中,退出页面可回收
3. 磁盘缓存(DiskCache)
  • 本地持久化缓存
  • 原图缓存处理后缓存
  • App 重启还在,不占内存
4. 网络缓存(网络请求)
  • 前面三级都没命中,才去网络下载
  • 下载完依次存入磁盘、内存、活跃缓存
加载流程口诀

先查活跃 → 再查内存 → 再查磁盘 → 最后走网络

一句话面试版

Glide 四级缓存依次是:活跃缓存、内存 Lru 缓存、磁盘缓存、网络;先从正在使用的活跃缓存找,再找内存、再找磁盘,都没有才请求网络,层层复用,省流量、省内存、减少 OOM。

4、Glide 为什么更省内存?

答案

  1. ImageView 实际尺寸 自动采样压缩,不加载全尺寸大图。
  2. 复用 Bitmap 内存池,减少频繁创建销毁 Bitmap。
  3. 绑定 Lifecycle,页面后台 / 销毁自动回收 Bitmap、取消加载
  4. LruCache 严格控制内存缓存上限,防止内存暴涨。

5、Glide 怎么绑定生命周期?有什么用

答案

Glide 内部集成 Lifecycle

绑定 Activity/Fragment 生命周期:

  • 页面 onStop:暂停图片请求
  • 页面 onDestroy:立即回收 Bitmap、取消任务、释放内存
  • 好处:减少流量、节省电量、防止内存泄漏、降低 OOM 概率。

6、Glide 缓存策略有几种?

答案

java

复制代码
DiskCacheStrategy.XXX
  1. ALL:缓存原图 + 压缩图
  2. NONE:不使用磁盘缓存
  3. DATA:只缓存原始图片
  4. RESOURCE:只缓存处理后的压缩图
  5. AUTOMATIC:自动根据资源类型决定(默认)

7、Glide 内存缓存和磁盘缓存区别

答案

  • 内存缓存:速度最快、APP 在就存在、占用内存、退出页面可回收。
  • 磁盘缓存:速度稍慢、持久化存储、不占内存、APP 重启仍有效。

8、Glide 怎么避免 OOM?

答案

  1. 自动根据 ImageView 大小采样降分辨率
  2. Bitmap 复用池,减少频繁创建对象。
  3. 绑定生命周期,页面销毁自动释放 Bitmap
  4. LruCache 限制内存缓存最大值。
  5. 大图手动设置 override() 固定宽高。
  6. 不用一次性加载大量高清原图。

9、Glide 加载流程源码简述

答案

  1. with ():绑定生命周期、获取上下文
  2. load ():设置图片资源地址
  3. into ():目标 ImageView,开始构建请求
  4. 内部经过:解码 → 变换 → 缓存查找 → 网络下载 → 存入缓存 → 回调显示
  5. 自动根据生命周期管理任务和内存回收。

10、into () 原理

答案 into 内部创建 Target 关联 ImageView;监听图片加载回调,成功后把 Bitmap 设置给 ImageView;同时监听 View 生命周期,View 被回收时自动取消加载、释放资源。

11、Glide 预加载作用

答案 preload() 提前把图片缓存到本地磁盘;进入页面时直接读缓存,秒开无等待,提升列表滑动流畅度。

12、Glide 加载 GIF 注意点

答案 默认支持 GIF;可强制只加载静态图 asBitmap();也可以 asGif() 强制动图;GIF 占用内存高,列表慎用大量动图。

13、Glide 自定义变换(圆角、圆形)

答案 继承 BitmapTransformation;重写 transform 方法,手动裁剪圆形、圆角;项目中常用自定义圆形裁剪、高斯模糊。

14、Glide 怎么清空缓存

答案

  • 清除内存缓存:Glide.get(context).clearMemory() 主线程
  • 清除磁盘缓存:Glide.get(context).clearDiskCache() 子线程

15、Glide 和 Coil 简单对比

答案

  • Glide:功能全、缓存强、成熟稳定、包稍大、Java 风格
  • Coil:Kotlin 原生、简洁轻量、基于协程、API 优雅、适合新项目

16、Glide 如何绑定 Activity 生命周期

1. 核心方式

Glide 调用 with(Activity/Fragment) 时,内部会自动创建一个无 UI 的空白 Fragment,挂靠在当前 Activity 上。

2. 原理

这个隐藏空白 Fragment 能精准感知 Activity 的生命周期:

  • 页面 onStart/onStop:自动暂停、恢复图片加载
  • 页面 onDestroy:自动取消所有请求、回收 Bitmap、释放内存
3. 为什么用空白 Fragment

Android 系统 Fragment 能天然监听宿主生命周期,不用改 Activity 任何代码,无侵入、就能实现生命周期感知。

4. 一句话总结

Glide 通过 with() 内部植入一个无 UI 空白 Fragment,借助 Fragment 感知 Activity 生命周期,自动在页面后台暂停加载、销毁时取消请求释放资源,避免内存泄漏和多余流量消耗。

相关推荐
-SOLO-1 小时前
使用Perfetto debug trace查看超时slice
android
阿巴斯甜1 小时前
Retrofit
android
阿巴斯甜1 小时前
OkHttp
android
阿巴斯甜2 小时前
Flow
android
用户86022504674724 小时前
Claw 分析 Perfetto Trace
android
游戏开发爱好者84 小时前
使用Fiddler设置HTTPS抓包诊断Power Query网络问题
android·ios·小程序·https·uni-app·iphone·webview
阿巴斯甜5 小时前
Lifecycle
android
fengci.5 小时前
CTF+随机困难部分
android·开发语言·网络·安全·php
阿巴斯甜5 小时前
LiveData
android