Glide 面试

1、看过Glide源码吗,你印象最深的是什么?

Glide的缓存设计可以说是非常先进的,考虑的场景也很周全。在缓存这一功能上,Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。
这两个缓存模块的作用各不相同,

  • 使用内存缓存的原因是:防止应用重复将图片读入到内存,造成内存资源浪费。
  • 使用硬盘缓存的原因是:防止应用重复从网络或其它地方下载和读取数据。
2、glide四级缓存

Glide 是一款强大的 Android 图片加载库,它支持四级缓存:活动缓存、内存缓存、磁盘缓存和网络缓存。

活动缓存(Activity Cache):活动缓存是 Glide 提供的最小限度的缓存机制。它保存了当前正在运行的 Activity 的图片请求结果,以便在用户进行快速滑动等操作时能够更快地获取图片,提升用户体验。但是,当 Activity 销毁时,活动缓存也会随之清空。

内存缓存(Memory Cache):内存缓存是指将图片数据存储在应用程序的内存中,这样可以快速访问图片而不需要再次从磁盘或网络中获取。Glide 内部使用了 LruCache 技术实现内存缓存,即根据最近最少使用原则来淘汰不常用的缓存数据,防止内存泄漏和 OOM 异常。

磁盘缓存(Disk Cache):磁盘缓存是指将图片数据存储在设备的本地磁盘上,以便在下次访问相同图片时无需再次下载。Glide 默认使用硬盘缓存技术将图片以文件形式存储在设备的磁盘上。这种方式可以减少重复下载图片的时间和流量消耗,并且可以在无网络情况下正常加载图片。

网络缓存(Network Cache):网络缓存是指将图片数据存储在远程服务器上,以便在下次访问相同图片时无需再次请求。Glide 会根据 HTTP 头部信息来判断是否启用网络缓存,如果服务器返回了合适的缓存头信息,那么 Glide 就会自动使用这个数据来展示图片,而不需要再次从网络中下载。

3、LruCache算法

LruCache算法,Least Recently Used,又称为近期最少使用算法。主要算法原理就是把最近所使用的对象的强引用存储在LinkedHashMap上,并且,把最近最少使用的对象在缓存池达到预设值之前从内存中移除。

4、Glide加载一个100x100的图片,是否会压缩后再加载?放到一个300x300的view上会怎样?
  • 当我们调整ImageView大小事,Glide会为每个不同尺寸的ImageView缓存一张图片,也就是说不管你的这张图片有没有被加载过,只要ImageView的尺寸不一样,那么GLide就会重新加载一次,这时候,他会在加载ImageView之前从网络上重新下载,然后再缓存。
    举个例子,如果一个页面的ImageView是300 * 300像素,而另一个页面中的ImageView是100 * 100像素,这时候想要让两个ImageView是同一张图片,那么Glide需要下载两次图片,并且缓存两张图片。
public <R> LoadStatus load() {
    EngineKey key = keyFactory.buildKey(model, signature, 
width, height, resourceClass, transcodeClass, options);
}
  • ImageView默认的scaleType是FIT_CENTER;
  • FitCenter的效果:会将图片按照原始的长宽比充满全屏;
  • 从上面代码可以看出,缓存key生成条件之一就是控件的宽高。
5、简单说一下内存泄漏的场景,如果在一个页面中使用Glide加载了一张图片,图片正在获取中,如果突然关闭页面,这个页面会造成内存泄漏吗?

Glide在加载资源的时候,如果是在Activity,Fragment这一类有生命周期的组件上进行的话,会创建一个透明的RequestManagerFragment加入到FragmentManager之中,感知生命周期,当Activity, Fragment等组件进入不可见,或者已经销毁的时候,Glide会停止加载资源。但是如果是在非生命周期的组件上进行时,会采用Application的生命周期贯穿整个应用,所以applicationManager只有在应用程序关闭时终止加载。

6、几种缓存模式
  • DiskCacheStrategy.ALL:原始图片和转换过的图片都缓存
  • DiskCacheStrategy.RESOURCE:只缓存原始图片
  • DiskCacheStrategy.NONE:不缓存
  • DiskCacheStrategy.DATA:只缓存使用过的图片
7、假如让你自己写个图片加载框架,你会考虑哪些问题?

首先,梳理一下必要的图片加载框架的需求:

  • 异步加载:线程池
  • 切换线程:Handler,没有争议吧
  • 缓存:LruCache、DiskLruCache
  • 防止OOM:软引用、LruCache、图片压缩、Bitmap像素存储位置
  • 内存泄露:注意ImageView的正确引用,生命周期管理
  • 列表滑动加载的问题:加载错乱、队满任务过多问题
8、Glide使用的设计模式
  • 构造者模式
9、Glide 传入 Application 或者 Activity 的Context区别:
  • 传入Application的Context,Glide 加载图片生命周期和系统应用一样;
  • 传入Activity 的Context,会生成一个 空的Fragment来管理 Glide 加载图片的生命周期(建议:传入Activity 的Context);
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值