Glide使用总结

 

  • 简介
    • 优点
      • 与使用环境生命周期相绑定:RequestManagerFragment & SupportRequestManagerFragment
      • 内存的三级缓存池:LruMemoryResources, ActiveResources, BitmapPool
      • 内存复用机制:BitmapPool
    • 为什么要绑定生命周期
      • 可以实现网络请求根据生命周期而暂停、执行、恢复、释放等
      • 可以实现资源比如图片的自动释放
      • 降低了内存的压力
      • 降低了内存泄漏的风险
  • Glide 使用指南
  • Glide源码分析
    • width()
      • 初始化Glide的同时在内部完成了RequestManagerRetriever的创建
      • 获取到的RequestManagerRetriever调用get()方法,获取到RequestManager,获取方式分为以下两种:
      • Context为Application时, 通过getApplicationManager()方法创建RequestManager完成,将生命周期的监听与Application强制绑定用于接收。
      • Context不为Application时, 通过supportFragmentGet()方法创建RequestManager完成,生命周期的监听是与Fragment进行绑定实现。
      • 总结
        • 总结来说with方法的作用就是获得当前上下文,构造出和上下文生命周期绑定的requestmanager,自动管理glide的加载开始和停止。
    • load()
      • 总结一下load作用,构造一个RequestBuilder实例,同时传入需要加载的数据源类型。
  • glide的总体流程

    Glide使用总结

  • glide的总体框架:

    Glide使用总结

  • Glide内存缓存机制
    • 不同于其他常见网络加载框架只有LruCatch一种缓存机制,Glide内存为三块(非常牛逼巧妙的设计
      • ActiveResourceCache:缓存当前正在使用的资源(注意是弱引用)
      • LruResourceCache: 缓存最近使用过但是当前未使用的资源,LRU算法
      • BitmapPool:缓存所有被释放的图片,内存复用,LRU算法
    • 让我们先看一下我们最常见到的LruMemoryCache机制

      Glide使用总结

      • 如图,当系统内存不足时,LruMemoryCache会根据LRU算法移除一些资源(bitmap)针对移除的资源,系统在GC时会回收资源(bitmap)以释放内存,当应用再次需要次资源时,需要重新分配内存,重新对资源文件进行解析生成bitmap
      • 1)这样会造成内存抖动;
      • 2)比较耗费时间,影响流畅度(GC也比较频繁)
    • 让我们再来看一下Glide的机制

      Glide使用总结

      • 如图,当系统内存不足时,LruResourceCache会根据LRU算法移除一些资源(resource)到BitmapPool
      • 到BitmapPool会根据LRU算法移除一些资源(bitmap)
      • 当应用再次需要资源时,会优先复用到BitmapPool中的bitmap对象(复用其内存),只需刷新bitmap的像素数据
      • 1)这样能有效地降低内存抖动;
      • 2)由于很多情况下可以复用废弃bitmap的内存,因此避免了内存分配等造成的性能损耗,系统比较流畅
      • 3)降低了系统GC的频率
      • 4)LruResourceCache和BitmapPool中都是当前不在使用的资源,做整体的资源回收那叫一个酸爽。
  • 分析源码的心得
    • 1.分析现有源码
    • 2.看懂源码的关键细节
    • 3.看懂底层API的细节
    • 4. 结合自己的项目经验贯通框架思维
    • 5. 模仿,手写,改进
  • 参考