Android Glide分析和使用

Android Glide分析和使用_第1张图片

1、Glide简介:

  • Glide 是 Google 员工的开源项目, Google I/O 上被推荐使用,一个高效、开源、Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。

  • gitHub地址:https://github.com/bumptech/glide

  • Glide调用时序图PDF版 :链接:http://pan.baidu.com/s/1b3nQIa 密码:ohy2

2、Glide特点

  • 使用简单

  • 可配置度高,自适应程度高

  • 支持常见图片格式 Jpg png gif webp

  • 支持多种数据源 网络、本地、资源、Assets 等

  • 高效缓存策略 支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半

  • 生命周期集成 根据Activity/Fragment生命周期自动管理请求

  • 高效处理Bitmap 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力

3、相关调用方法

Glide.with 方法解析

  • 将当前显示的页面对象传入Glide


    Android Glide分析和使用_第2张图片
  • RequestManager主要作用为实现request和Activity生命周期相关联

  • with()方法的重载种类非常多,既可以传入Activity,也可以传入Fragment或者是Context。每一个with()方法重载的代码都非常简单,都是先调用RequestManagerRetriever的静态get()方法得到一个RequestManagerRetriever对象,这个静态get()方法就是一个单例实现,没什么需要解释的。然后再调用RequestManagerRetriever的实例get()方法,去获取RequestManager对象。

  • get 方法获取RequestManager

Android Glide分析和使用_第3张图片
  • 根据 Looper.myLooper == Looper.getMainLooper();判断是否在后台线程中
Android Glide分析和使用_第4张图片
Android Glide分析和使用_第5张图片
  • 通过supportFragmentGet方法获取RequestManager
Android Glide分析和使用_第6张图片
  • 如果RequestManager为空。需要重新创建,并绑定Activity或者Fragment.


    Android Glide分析和使用_第7张图片
  • SupportRequestManagerFragment

    • 监听当前页面的生命周期


      Android Glide分析和使用_第8张图片
  • 生命周期的监听,从而处理RequestManager


    Android Glide分析和使用_第9张图片
  • ActivityFragmentLifecycle

    • 观察者模式,fragment的生命周期交给了他
Android Glide分析和使用_第10张图片
  • RequestManager的实现
Android Glide分析和使用_第11张图片

Load方法分析

  • 判断当前的ImageView是否存在了请求,如果存在 将请求取消,并且回收资源 .
Android Glide分析和使用_第12张图片

into方法

Android Glide分析和使用_第13张图片

Glide流程

  • Glide.with(context)创建RequestManager

    • RequestManager负责管理当前context的所有Request
    • Context可以传Fragment、Activity或者其他Context,当传Fragment、Activity时,当前页面对应的Activity的生命周期可以被RequestManager监控到,从而可以控制Request的pause、resume、clear。这其中采用的监控方法就是在当前activity中添加一个没有view的fragment,这样在activity发生onStart onStop onDestroy的时候,会触发此fragment的onStart onStop onDestroy。
    • RequestManager用来跟踪众多当前页面的Request的是RequestTracker类,用弱引用来保存运行中的Request,用强引用来保存暂停需要恢复的Request。
  • Glide.with(context).load(url)创建需要的Request

    • 通常是DrawableTypeRequest,后面可以添加transform、fitCenter、animate、placeholder、error、override、skipMemoryCache、signature等等
    • 如果需要进行Resource的转化比如转化为Byte数组等需要,可以加asBitmap来更改为BitmapTypeRequest
    • Request是Glide加载图片的执行单位
  • Glide.with(context).load(url).into(imageview)
    在Request的into方法中会调用Request的begin方法开始执行
    在正式生成EngineJob放入Engine中执行之前,如果并没有事先调用override(width, height)来指定所需要宽高,Glide则会尝试去获取imageview的宽和高,如果当前imageview并没有初始化完毕取不到高宽,Glide会通过view的ViewTreeObserver来等View初始化完毕之后再获取宽高再进行下一步

  • Glide加载资源:

    • GlideBuilder在初始化Glide时,会生成一个执行机Engine
    • Engine中包含LruCache缓存及一个当前正在使用的active资源Cache(弱引用)
      activeCache辅助LruCache,当Resource从LruCache中取出使用时,会从LruCache中remove并进入acticeCache当中
    • Cache优先级LruCache>activeCache
    • Engine在初始化时要传入两个ExecutorService,即会有两个线程池,一个用来从DiskCache获取resource,另一个用来从Source中获取(通常是下载)
      线程的封装单位是EngineJob,有两个顺序状态,先是CacheState,在此状态先进入DiskCacheService中执行获取,如果没找到则进入SourceState,进到SourceService中执行下载
  • Glide的Target:

    • 负责图片加载的回调

你可能感兴趣的:(Android Glide分析和使用)