Glide 重点
生命周期管理 和缓存
with
- 对于activity的:以onstart为例
- 会新建2个空白fragment(androidx的fragment;app的fragment),用于监听生命周期函数。
- 当监听到变化的时候,会调用ActivityFragmentLifeCycle(实现了LifeCycle)的onstart方法,这里是个集合,遍历调用执行onstart
- LifecycleListener 在RequestManager里面实现的,这里再去分发调用Glide里面的其他的xxtarget类
- 注意:其中fragment那里的创建 可以参考,用先存入集合再调用begintransaction comitallowingstateloss 来保证fragment不被重复创建,还用handler 移除集合 来保证不会重建,因为消息是在handler的等待队列里面的,要handler来把他放到执行队列里面。
- 对于没有界面的:
- 用的applicationcontext,和整个程序一样的生命周期。
- with流程
- 空白fragment(app+androidx)-->ActivityFragmentLifecycle实现lifecycle-->LifecycleListener-->RequestManager实现LifecycleListener-->glide里面其余的 ImageViewTarget、DefaultConnectivity...
- ApplicationLifecycle 实现Lifecycle -->操作LifecycleListener
缓存分析
- 先调用活动缓存
当前界面显示的都在活动缓存里面,生命周期的ondestory的时候 再把缓存数据全部放入LRU缓存 - 再调用内存LRU缓存
需要用的时候会把数据放入活动缓存,删掉LRU里面的对应缓存 - 再调用本地LRU缓存 J 安卓之神写的 DiskLRU缓存
参考的LRU缓存,需要的时候复制数据到活动缓存,不会删掉本地的 - 再网上取或者drawable本地取
先存入本地LRU缓存,用的时候再走活动缓存
整体简化主线流程 glide11 的url版本 主要into
Glide构建
-->with:给每个RequestManager绑定一个空白fragment管理生命周期(分支:application无页面)
-->into:Request对象的构建:请求、宽、高、采样...
-->请求之前 先检测缓存
-->Engine缓存机制的检测:先检测活动缓存ActiveResources、再检测内存缓存LruResourceCache 如果命中任意一级缓存则回调直接显示
-->没有缓存,则在EnginJob构建异步任务
-->xxtask:执行Request之前,先检测DiskCache本地磁盘缓存
-->如果没有磁盘缓存,通过网络请求,返回输入流inputstream
-->解析输入流,进行采样压缩,得到Bitmap;这里有很多跳转中转包装的过程
-->Bitmap转换为Drawable
-->构建磁盘缓存DiskCache
-->构建内存缓存ActiveResource
-->回到ImageViewTarget 子类 DrawableImageViewTarget显示图片
看源码思路
- 第一次看:先看下别的博客的流程,有个大概概念
- 第二次看:先走主线流程,埋下伏笔
接口的地方,一步步跳转进去找到实现即可。 - 第三次看:重点主线流程,关注下支线
- 第四次看:如果主线清晰了,再分析支线,不清晰则继续第四次....