基本用法
使用Glide加载图片非常方便,只要简单三步链式调用即可:
1 | Glide.with(context) |
with()
Glide.with()
方法的所有重载方法都是下面的形式,只是传入的参数类型有区别,这里主要分为两步getRetriever()
和get()
:
1 | public static RequestManager with(@NonNull Context context) { |
不管with()
方法的参数是啥,其实最终都是通过getRetriever()
方法回去到RequestManagerRetriever
对象,再通过它获取到RequestManager
:
1 | private static RequestManagerRetriever getRetriever(@Nullable Context context) { |
重点主要是在RequestManagerRetriever.get(context)
上,该方法会判断传入的context
的实际类型,并返回不用的RequestManager
,主要有如下几种特殊类型:
FragmentActivity
Activity
ContextWrapper
ApplicationContext
1 | public RequestManager get(@NonNull Context context) { |
对于传入的是ApplicationContext
或者不是在UI线程执行的情况,Glide只是简单的获取了单例的ApplicationManager
对象:
1 | private RequestManager getApplicationManager(@NonNull Context context) { |
如果传入的是FragmentActivity
和Activity
的情况,采取的方案比较类型,首先判断是否在UI线程,如果不在,则走的逻辑和ApplicationContext
的情况相同,否则继续调用supportFragmentGet()
或fragmentGet()
:
1 | public RequestManager get(@NonNull FragmentActivity activity) { |
supportFragmentGet()
和fragmentGet()
的实现类似,只是一个用的app包下的Fragment,一个用的Support包下的Fragment,以supportFragmentGet()
为例,该方法会创建一个没有View的空Fragment,并将它添加到Activity中,Glide会通过它对Activity的生命周期进行监听,达到根据Activity生命周期进行加载的目的:
1 | private RequestManager supportFragmentGet( |
load()
RequestManager.load()
方法会先使用asDrawable()
方法创建一个RequestBuilder<Drawable>
对象,再调用RequestBuilder
对象的load()
方法,最终调用loadGeneric()
方法设置数据源,并设置数据源以设置的标记为:
1 | public RequestBuilder<Drawable> load(@Nullable String string) { |
从名字可以看到,RequestBuilder
实际上使用的是Builder
模式,在此之上常见的error()
、placeHolder()
等方法都是基于此。