一、初始化流程
-
Glide.with()方法- 根据传入的
Context/Activity/Fragment类型,通过RequestManagerRetriever获取对应的RequestManager实例。 - 关键点:绑定生命周期(如
Activity销毁时自动取消请求),通过LifecycleListener实现与页面生命周期的同步。
- 根据传入的
-
Glide 单例初始化
- 通过
Glide.get(context)触发双重检查锁单例初始化,加载GeneratedAppGlideModule配置(如自定义缓存策略。 - 初始化线程池、注册组件(如
ModelLoader、Encoder)等核心模块。
- 通过
Glide.with(Context){
return getReceiver(Context){
//创建RequestMangerService
return Glide.get().getRequestManagerReceiver()
}.get(Context){
//如果在子线程或传不带有生命周期的Context则以Application作为生命周期
if(Util.isOnBackgroundThread()){
return get(activity.getApplicationContext());
}else{
//建了一个RequestManagerFragment空页面,与Glide绑定生命周期
return fragmentGet(activity, fm, /*parentHint=*/ null, isActivityVisible(activity)){
//创建空白fragment
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint){
public void onStart() {
super.onStart();
lifecycle.onStart();
}
//...绑定其余生命周期
}
//创建requestManger
requestManager = factory.build(glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
//fragment传requsetManger,当fragment生命周期变化通知requestManger,然后再通知Glide
current.setRequestManager(requestManager);
return requestManager;
}
}
}
}
二、请求执行流程(load() 和 into())
-
数据加载(
load())
load()返回RequestBuilder对象,支持多种数据源(URL、资源ID等)。通过loadGeneric()方法解析数据模型,生成DrawableTypeRequest。
RequestManger.load{
return asDrawable().load(string)->loadGeneric(string){
//返回RequestBuilder<TranscodeType>
return clone().loadGeneric(model);
}
}
-
目标绑定(
into())
into()触发以下流程:-
构建请求:
buildRequest()创建SingleRequest对象,封装图片加载参数。 -
执行请求:
RequestTracker.runRequest()将请求加入运行队列,通过Engine.load()启动加载。 -
资源获取:优先从内存缓存(
LruResourceCache)读取,未命中则通过DecodeJob异步加载磁盘或网络数据。
-
构建请求:
RequestBuilder.into{
return into(viewTarget,targetListener,requestOptions,Executors.mainThreadExecutor()){
/**① 创建一个SingleRequest对象 */
Request request = buildRequest(target, targetListener, options, callbackExecutor);
/** 给Target赋值 */
target.setRequest(request);
/** 发起请求的开始 */
requestManager.track(target, request){
requestTracker.runRequest(request){
request.begin(){
onSizeReady(overrideWidth, overrideHeight){
//创建一个EngineKey与加载图片唯一绑定
EngineKey key = keyFactory.buildKey();
//缓存加载
memoryResource = loadFromMemory(key, isMemoryCacheable, startTime){
//活动缓存加载
loadFromActiveResources(key);
//未命中的话Lru缓存加载
loadFromCache(key);
}
//网络加载
aitForExistingOrStartNewJob()
//加载成功后回调
cb.onResourceReady(){
//图片资源写入active缓存
}
}
//图片资源获取到以后,解码并交个target也就是ImagevIEW去加载图片
onResourceReady() {
target.onResourceReady(result, animation){
setResourceInternal(resource){
view.setImageBitmap(resource);
}
}
}
}
}
}
return target;
}
}
三、缓存机制
-
三级缓存设计
-
内存缓存:分为
ActiveResources(活跃资源)和LruResourceCache(LRU 缓存),前者存储正在使用的资源,后者存储最近使用资源。 -
磁盘缓存:通过
DiskLruCacheWrapper实现,支持SOURCE(原始数据)和RESULT(处理后的数据)两种策略。
-
内存缓存:分为
-
缓存命中逻辑
javaCopy Codepublic class Engine { public <R> LoadStatus load(...) { EngineResource<?> cached = loadFromMemory(key, isMemoryCacheable); // 内存优先:ml-citation{ref="7" data="citationList"} if (cached != null) return new LoadStatus(...); return waitForExistingOrStartNewJob(...); // 启动磁盘或网络加载:ml-citation{ref="6" data="citationList"} } }
四、线程管理
-
异步加载机制
DecodeJob通过GlideExecutor线程池执行耗时操作(如网络请求、磁盘读取),完成后通过Handler(主线程MainThreadExecutor)更新 UI。 -
资源回收
图片不可见时,Target(如ImageViewTarget)触发onStop(),释放资源并回收至内存缓存。