简述
-
glide的优点和使用方式大家肯定都已经知道了,所以本文主要详细介绍glide的源码流程以及缓存,解码等的源码流程(非常详细,并且适合源码阅读水平不太充足的同学)。
开始
最近在研究glide的源码,但是网上关于glide源码的文章大多不够详尽,部分方法点到即止,又因为glide源码的封装非常复杂,导致通过阅读文章只能大概分析代码流程,对于细节总是一知半解,所以写本文章的目的就是能把这些细节详细的写下来,算是对这几天glide学习的一个总结。文章会非常长,但是如果能阅读完,相信对你理解glide,以及对于其他框架、源码等的阅读都会带来帮助。
glide.with()
使用glide是第一步就是 glide.with() ,那么分析的第一步就从这个方法开始。
public static RequestManager with(Context context) {
return getRetriever(context).get(context);
}
可以看到 with() 方法返回的是 RequestManager 对象,那么return中就是创建这个对象的过程,先来看 getRetriever(context) 方法
//首先调用 Glide的静态get方法初始化glide对象,然后调用getRequestManagerRetriever()创建
//RequestManagerRetriever对象
private static RequestManagerRetriever getRetriever(@Nullable Context context) {
return Glide.get(context).getRequestManagerRetriever();
}
private static volatile Glide glide;
public static Glide get(Context context) {
if (glide == null) {
synchronized (Glide.class) {
if (glide == null) {
checkAndInitializeGlide(context);
}
}
}
return glide;
}
public RequestManagerRetriever getRequestManagerRetriever() {
return requestManagerRetriever;
}
此段代码流程如下:
1、初始化glide对象, 可以看到 glide对象使用了volatile 关键字, 并且通过 synchronized 同步代码包裹创建对象的过程,这里就是经典的双重校验锁的单例。
2、获取全局变量requestManagerRetriever ,此对象在glide对象创建时创建。下文中进行分析。
checkAndInitializeGlide() 方法最终会 initializeGlide()。
private static void initializeGlide(Context context) {
initializeGlide(context, new GlideBuilder());
}
private static void initializeGlide(Context context, GlideBuilder builder) {
..
// 创建RequestManager的工厂类
RequestManagerRetriever.RequestManagerFactory factory =
annotationGeneratedModule != null
? annotationGeneratedModule.getRequestManagerFactory() : null;
builder.setRequestManagerFactory(factory);
// 最重要的就是此行代码,其他代码忽略
Glide glide = builder.build(applicationContext);
..
Glide.glide = glide;
}
通过GlideBuilder.build方法创建glide对象
//先大概记住方法中创建的类的作用,后续会有详细的分析
public Glide build(Context context) {
// 创建资源加载线程池, 核心线程根据手机cpu核数决定,核数大于4,那么线程数为4,小于4,为cpu
//核数
if (sourceExecutor == null) {
sourceExecutor = GlideExecutor.newSourceExecutor();
}
// 缓存加载线程池 核心线程数量为1
if (diskCacheExecutor == null) {
diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
}
//动画线程池 核心线程数 cpu核数>=4,则为2,否则为1
if (animationExecutor == null) {
animationExecutor = GlideExecutor.newAnimationExecutor();
}
// 缓存大小的计算
if (memorySizeCalculator == null) {
memorySizeCalculator = new MemorySizeCalculator.Builder(context).build();
}
// 用来创建生命周期监听对象ConnectivityMonitor的工厂
if (connectivityMonitorFactory == null) {
connectivityMonitorFactory = new DefaultConnectivityMonitorFactory();
}
// 根据计算得到的缓存大小创建bitmap缓存池
if (bitmapPool == null) {
int size = memorySizeCalculator.getBitmapPoolSize();
if (size > 0) {
bitmapPool = new LruBitmapPool(size);
} else {
bitmapPool = new BitmapPoolAdapter();
}
}
//arrayPool是对数组池,主要用于图片解析时存储临时数据用
//根据数组池的大小创建LruArrayPool