• Glide
  • get,checkAndInitializeGlide,initializeGlide
  • Glide glide = GlideBuilder.build();
  • new Engine(),new Glide()并在Glide构造函数注册功能模块
  • new GlideContext()管理并对外暴露Engine、Pool等
  • SingleRequest
  • 从Glide.with()开始,得到RequestManager
  • RequestManagerRetriever.getRetriever()得到 RequestManager
  • RequestManager.load()方法调用as()方法得到 RequestBuilder
  • RequestBuilder.into()方法调用buildRequest()方法创建请求
  • Request.begin()或者RequestManager.track(target, request)
  • RequestTracker.runRequest(request)
  • Request.begin()
  • CustomViewTarget里的SizeDeterminer结合LayoutParams和ViewTreeObserver测试View的宽高
  • onSizeReady->engine.load()
  • Engine
  • engine.load()开始处理请求
  • keyFactory.buildKey为每个请求创建Key包含宽高等
  • loadFromMemory()先从缓存获取
  • 没有命中缓存,开启waitForExistingOrStartNewJob任务
  • engineJobFactory.build()创建一个engineJob,含有Executor等
  • decodeJobFactory.build()创建一个decodeJob,负责策略选择
  • engineJob.start(decodeJob)开启线程处理,逻辑在decodeJob线程
  • DecodeJob线程run()方法执行,调用runWrapped()方法
  • 接着getNextGenerator()选择对应DataFetcherGenerator
  • runGenerators方法调用currentGenerator.startNext()开始
  • glideContext.getRegistry().getModelLoaders()获取ModelLoader
  • 调用ModelLoader实例loadData.fetcher.loadData()方法处理数据
  • 接着就是层层回调处理咯。
  • SourceGenerator.onDataReadyInternal->dataToCache = data赋值给缓存,然后再调度一次cb.reschedule()->cacheData(data)缓存Data数据
  • DecodeJob.onDataFetcherReady->decodeFromRetrievedData解码图片类型->decodeFromFetcher->runLoadPath根据LoadPath解码图片
  • 通知解码图片结果DecodeJob.notifyEncodeAndRelease->通知解码完成DecodeJob.notifyComplete
  • 回调通知引擎类EngineJob.onResourceReady->entry.executor.execute(new CallResourceReady(entry.cb))通知View层监听回调->target.onResourceReady->ImageViewTarget.onResourceReady->BitmapImageViewTarget.setResource->view.setImageBitmap(resource);
  • engineJobListener.onEngineJobComplete->jobs.removeIfCurrent(key, engineJob)
  • 查找逻辑
  • RESOURCE_CACHE查找裁剪处理后的缓存ResourceCacheGenerator
  • DATA_CACHE查找未经过处理的缓存DataCacheGenerator
  • SWITCH_TO_SOURCE_SERVICE转为SOURCE查找网络等SourceGenerator
  • source查找到后进行runLoadPath解码资源
  • 状态监听处理-综合利用
  • 方式一:View级别的,利用View的attached和detached窗口回调
  • view.addOnAttachStateChangeListener(attachStateListener)利用View的attached和detached窗口状态变化监听控制请求的paused和resumed

  • 方式二:页面生命周期级别的,利用添加空的Fragment生命周期回调或者Application级别的ComponentCallbacks2回调
  • 如果context是FragmentActivity或者Activity类型:添加空的Fragment,利用Fragment生命周期回调


Glide.with(activity)->getRetriever(activity).get(activity)->fragmentGet->getRequestManagerFragment->fm.beginTransaction().add(current,FRAGMENT_TAG).commitAllowingStateLoss()添加一个RequestManagerFragment,利用Fragment的生命周期比如onStart、onStop、onDestroy变化监听控制请求的paused、resumed和clear。


  • 如果context不是FragmentActivity或者Activity类型:就利用Application级别的ComponentCallbacks2回调


Glide.initializeGlide->applicationContext.registerComponentCallbacks(glide);Glide类实现ComponentCallbacks2接口,不能控制请求paused、resumed状态,而是做内存清理工作。


  • 方式三:监听网络状态变化
    GlideBuilder.build->DefaultConnectivityMonitorFactory->DefaultConnectivityMonitor监听网络变化监听控制请求的paused、resumed。