zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Hackerrank alien-flowers(数学公式)
    Hackerrank manasa-and-combinatorics(数学推导)
    Codeforces 314B(倍增)
    Codeforces Round #403(div 2)
    Mutual Training for Wannafly Union #6
    几道splay
    高数(A)下 第十章
    Bestcoder #92
    codevs1700 施工方案第二季
    poj2631
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/14429221.html
Copyright © 2011-2022 走看看