zgq105 / blog

2 stars 0 forks source link

Glide源码总结 #96

Open zgq105 opened 2 years ago

zgq105 commented 2 years ago

1.加载图片的过程? 缓存策略?

Glide其实是一个单例,每次使用的时候,如果没有初始化就做初始化;Glide初始化是通过GlideBuilder建造者进行相关属性的初始化。在初始化的过程当中会创建RequestManager并且注入SDK内部实现的生命周期Lifecycle,这里用的比较巧的就是通过创建一个无界面的SupportRequestManagerFragment然后监听Fragment的生命周期,就可以利用生命周期的特性做一些资源释放等操作,同时将生命周期的回调分发到外面。

Request对象创建是RequestBuilder类中into方法创建,如下:

image

发起图片资源的请求和ImageView视图关联的方法也是在RequestBuilder类中into方法,如下:

image

由于后续的请求过程和缓存图片的策略涉及的代码比较多,打算用一张流程图来描述,如下:

image

2.如何管理内存缓存?

在Glide中的内存缓存分为两种,第一种是通过弱引用实现的最上层的更高效的内存缓存,在ActiveResources类中的一个Map,如下:

image

还有另一种缓存是通过LRU算法实现的更下一层的内存缓存,在LruResourceCache类中实现的缓存机制,LRU算法是LinkedHashMap实现的,这里不展开。

3.Glide中如何管理内存缓存,在内存紧张时,释放一部分内存缓存,内存占用小的时候,多缓存呢?

其实在Glide中实现了ComponentCallbacks2接口,同时重写了onTrimMemory方法和onLowMemory方法,其中onLowMemory为了兼容API 14以下的低版本,如下图所示:

image

接下来看下内部实现,其实就是调用了各个缓存模式的实现,如下所示:

image

以memoryCache.trimMemory(level)为例,其内部实现是监听的是Android系统的内存回调再加上LRU算法来释放管理内存,如下:

image

4.设计模式的应用

4.1 单例模式的应用Glide类中使用的就是volatile加synchronized双重校验实现的懒加载单例,如下:

image

4.2 抽象工厂的应用DiskCache为例,DiskCache.Factory定义了抽象工厂,DiskLruCacheFactory是具体工厂;DiskCache是抽象产品,DiskLruCacheWrapper是具体产品,如下:

image

4.3 策略模式的应用DiskCacheStrategy类为例,它是一个抽象类,内部通过静态常量加匿名内部类的方式实现了多种策略,ALL,NONE,DATA,RESOURCE,AUTOMATIC。代码举例如下:

image

4.4 观察者模式的应用Lifecycle为例实现了生命周期的监听和管理,如下所示:

image

5 BitmapPool和ArrayPool的巧用

BitmapPool和ArrayPool 都是通过LRU内存缓存复用对象,减少对象的创建和内存回收,提升内存使用效率,减少内存碎片,大大提升加载的性能。对象池化的机制在其他地方也是经常使用,比如,常见的连接池、线程池等。