Android-Glide源码分析

一、初始化流程

  1. Glide.with() 方法
    • 根据传入的 Context/Activity/Fragment 类型,通过 RequestManagerRetriever 获取对应的 RequestManager 实例。
    • 关键点:绑定生命周期(如 Activity 销毁时自动取消请求),通过 LifecycleListener 实现与页面生命周期的同步。
  2. Glide 单例初始化
    • 通过 Glide.get(context) 触发双重检查锁单例初始化,加载 GeneratedAppGlideModule 配置(如自定义缓存策略。
    • 初始化线程池、注册组件(如 ModelLoaderEncoder)等核心模块。
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()

  1. 数据加载(load()
    load() 返回 RequestBuilder 对象,支持多种数据源(URL、资源ID等)。通过 loadGeneric() 方法解析数据模型,生成 DrawableTypeRequest
RequestManger.load{
    return asDrawable().load(string)->loadGeneric(string){
        //返回RequestBuilder<TranscodeType>
        return clone().loadGeneric(model);
    }
}
  1. 目标绑定(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;
    }
}

三、缓存机制

  1. 三级缓存设计

    • 内存缓存:分为 ActiveResources(活跃资源)和 LruResourceCache(LRU 缓存),前者存储正在使用的资源,后者存储最近使用资源。
    • 磁盘缓存:通过 DiskLruCacheWrapper 实现,支持 SOURCE(原始数据)和 RESULT(处理后的数据)两种策略。
  2. 缓存命中逻辑

    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"}
        }
    }
    

四、线程管理

  1. 异步加载机制
    DecodeJob 通过 GlideExecutor 线程池执行耗时操作(如网络请求、磁盘读取),完成后通过 Handler(主线程 MainThreadExecutor)更新 UI。
  2. 资源回收
    图片不可见时,Target(如 ImageViewTarget)触发 onStop(),释放资源并回收至内存缓存。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容