- 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窗口回调
- 方式二:页面生命周期级别的,利用添加空的Fragment生命周期回调或者Application级别的ComponentCallbacks2回调
view.addOnAttachStateChangeListener(attachStateListener)利用View的attached和detached窗口状态变化监听控制请求的paused和resumed
- 如果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。