前言
在上一篇文章中我们体验了Glide-4.0的强大,以及更加简便的API,很多童鞋已经开始迁移了,那么接下来我们一起探索一下他的神奇之处:
首先我们来看一下4.0的基本用法:
GlideApp.with(this)
.load(R.raw.large_giphy_logo)
.into(giphyLogoView);
就这么简简单单的一句代码,其实Glide在背后帮我们做了成吨的事情。所以为了解开大家的好奇,一起来解析一下Glide-4.0源码。
准备
想要阅读源码那么久需要先下载源码,
GitHub地址:
https://github.com/bumptech/glide
我们这一篇是基于4.1.0讲解的,后续如果想查看这个版本的代码可以通过下面的链接:
https://github.com/bumptech/glide/tree/v4.1.1
剩下的应该不用说了吧,直接
git clone https://github.com/bumptech/glide.git
下载好源码之后我们可以看到里面有五个demo,我们可以运行一下看看效果,这里就不给大家挨着展示了。
到这里我们即将开启我们的源码之旅。
可能我们最大的疑惑就是glide为什么就用了简单的一句代码就可以实现图片的加载。
GlideApp.with(this).load(R.raw.large_giphy_logo).into(giphyLogoView);
首先,先说一下今天的解读思路:
Glide基本的加载步骤是三步那么我们就分别解读这三步with()
,load()
,into()
到底是如何实现的,以及GlideApp
是什么鬼?
今天这篇文章先讲述一下 GlideApp
和 with()
背后的故事。
GlideApp如何诞生?
1、 @GlideModule注解做了什么事情?
/**
*在编译时,为AppGlideModules和LibraryGlideModules提供注入。
*
*替换掉 AndroidManifest.xml 中value="GlideModule" 的 <meta-data /> 。
*这里需要注意后续需要用到<meta-data />这个标签,先记住此处
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface GlideModule {
/**
*此处返回的name就是你在使用时的class name。
*
*eg:将GlideApp改为GlideAppX
*那么通过注解生成的类就是GlideAppX
*那么你使用时候就会是 GlideAppX.with(this)
*/
String glideName() default "GlideApp";
}
注视已经详细介绍了这个类的作用,后面我们来看一下生成的GlideApp。
2、GlideApp能做啥?
GlideApp这个类事通过上面的注解获得到的,是不容许被修改的,是Glide在应用中的入口,做一些初始化,获取图片存储路径之类的,非常简单,注释也非常清楚,就不详细叙述了。
此处省略中间代码,
public final class GlideApp {
private GlideApp() {
}
/**
* @see Glide#getPhotoCacheDir(Context)
*/
@Nullable
public static File getPhotoCacheDir(Context context) {
return Glide.getPhotoCacheDir(context);
}
...
... 省略
...
/**
* @see Glide#with(View)
*/
public static GlideRequests with(View view) {
return (GlideRequests) Glide.with(view);
}
}
那么到了这里我们已经知道了GlideAPP是如何诞生的以及GlideApp都有哪些方法。
接下来我们就详细看一下AppGlideModule做什么了,为啥要继承AppGlideModule?
3.为什么继承AppGlideModule?
我们先来看一下***AppGlideModule***的API