-
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。
-