- 简介
- 优点
- 与使用环境生命周期相绑定: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实例,同时传入需要加载的数据源类型。
- width()
- glide的总体流程
- glide的总体框架:
- Glide内存缓存机制
- 不同于其他常见网络加载框架只有LruCatch一种缓存机制,Glide内存为三块(非常牛逼巧妙的设计
- ActiveResourceCache:缓存当前正在使用的资源(注意是弱引用)
- LruResourceCache: 缓存最近使用过但是当前未使用的资源,LRU算法
- BitmapPool:缓存所有被释放的图片,内存复用,LRU算法
- 让我们先看一下我们最常见到的LruMemoryCache机制
- 如图,当系统内存不足时,LruMemoryCache会根据LRU算法移除一些资源(bitmap)针对移除的资源,系统在GC时会回收资源(bitmap)以释放内存,当应用再次需要次资源时,需要重新分配内存,重新对资源文件进行解析生成bitmap
- 1)这样会造成内存抖动;
- 2)比较耗费时间,影响流畅度(GC也比较频繁)
- 让我们再来看一下Glide的机制
- 如图,当系统内存不足时,LruResourceCache会根据LRU算法移除一些资源(resource)到BitmapPool
- 到BitmapPool会根据LRU算法移除一些资源(bitmap)
- 当应用再次需要资源时,会优先复用到BitmapPool中的bitmap对象(复用其内存),只需刷新bitmap的像素数据
- 1)这样能有效地降低内存抖动;
- 2)由于很多情况下可以复用废弃bitmap的内存,因此避免了内存分配等造成的性能损耗,系统比较流畅
- 3)降低了系统GC的频率
- 4)LruResourceCache和BitmapPool中都是当前不在使用的资源,做整体的资源回收那叫一个酸爽。
- 不同于其他常见网络加载框架只有LruCatch一种缓存机制,Glide内存为三块(非常牛逼巧妙的设计
- 分析源码的心得
- 1.分析现有源码
- 2.看懂源码的关键细节
- 3.看懂底层API的细节
- 4. 结合自己的项目经验贯通框架思维
- 5. 模仿,手写,改进
- 参考
- https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
- http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html
- https://xiaodanchen.github.io/2016/08/19/%E8%B7%9F%E7%9D%80%E6%BA%90%E7%A0%81%E5%AD%A6%E8%AE%BE%E8%AE%A1%EF%BC%9AGlide%E6%A1%86%E6%9E%B6%E5%8F%8A%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%EF%BC%88%E4%B8%80%EF%BC%89/