android開發Glide4.12.0源碼理解分析簡單記錄


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM