码迷,mamicode.com
首页 > 移动开发 > 详细

android开发Glide4.12.0源码分析理解简单记录

时间:2021-02-23 14:10:08      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:target   next   页面   etc   功能   sed   变化   roi   one   

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

android开发Glide4.12.0源码分析理解简单记录

标签:target   next   页面   etc   功能   sed   变化   roi   one   

原文地址:https://www.cnblogs.com/yongfengnice/p/14429221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!