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。

posted @   yongfengnice  阅读(485)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2019-02-22 android常用设计模式的理解
点击右上角即可分享
微信分享提示