一,图片处理框架ImageLoader
缓存策略:内存缓存+磁盘缓存
内存缓存
1.缓存是用什么数据结构实现的
数据结构LruMemoryCache里面有个LinkedHashMap来存储缓存Bitmap对象。key是URL,value是bitmap对象
LinkedHashMap查找的时间复杂度是:O(1)
LruMemoryCache缓存的是bitmap的强引用,当前缓存图片大于之前设置的缓存空间时,会将最近最少使用的缓存清除
具体原理是:LinkedHashMap的put/get方法
get:每次get都会将获取到的entry对象移到链表尾端
put:每次put后都会尝试去GC,清除最近最少使用的缓存对象
磁盘缓存
如果app需要加载大量的图片,如新浪微博等超级app,是很有必要使用磁盘缓存的
参考:https://www.cnblogs.com/kissazi2/p/3931400.html
线程池策略:
Glide原理
1. with(context): context生命周期决定了Glide加载图片的生命周期
向当前的Activity当中添加一个隐藏的Fragment,根据fragment生命周期来捕获activity的生命周期
第一个with()方法的源码还是比较好理解的。其实就是为了得到一个RequestManager对象而已,然后Glide会根据我们传入with()方法的参数来确定图片加载的生命周期,并没有什么特别复杂的逻辑
ActivityFragmentLifecycle
https://juejin.im/post/5b5b1a275188251aad211d7c
2. load(URL)
返回:DrawableTypeRequest对象
3. into(View)
图片加载线程通过Handler 发送消息到主线程,更新UI
4.缓存原理
内存缓存
使用的数据结构:LinkedHashMap
算法:LruCache算法
算法原理:把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除
过程:先从弱引用缓存中获取,获取到后直接返回,如果获取不到再从Lru缓存中获取,获取到返回(同时放进弱引用中),获取不到开启线程执行后面的图片加载逻辑。
特色:引入了弱引用机制,正在使用中的图片使用弱引用来进行缓存,不在使用中的图片使用LruCache来进行缓存的功能。使用activeResources来缓存正在使用中的图片,可以保护这些图片不会被LruCache算法回收掉。
磁盘缓存
算法:DiskLruCache
5. 回调机制
6. 图片处理
7. 网络请求
Glide默认使用的是HttpURLConnection进行网络请求
Glide原理
1. with(context): context生命周期决定了Glide加载图片的生命周期
向当前的Activity当中添加一个隐藏的Fragment,根据fragment生命周期来捕获activity的生命周期
第一个with()方法的源码还是比较好理解的。其实就是为了得到一个RequestManager对象而已,然后Glide会根据我们传入with()方法的参数来确定图片加载的生命周期,并没有什么特别复杂的逻辑
ActivityFragmentLifecycle
2. load(URL)
返回:DrawableTypeRequest对象
3. into(View)
图片加载线程通过Handler 发送消息到主线程,更新UI
4.缓存原理
内存缓存
使用的数据结构:LinkedHashMap
算法:LruCache算法
算法原理:把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除
过程:先从弱引用缓存中获取,获取到后直接返回,如果获取不到再从Lru缓存中获取,获取到返回(同时放进弱引用中),获取不到开启线程执行后面的图片加载逻辑。
特色:引入了弱引用机制,正在使用中的图片使用弱引用来进行缓存,不在使用中的图片使用LruCache来进行缓存的功能。使用activeResources来缓存正在使用中的图片,可以保护这些图片不会被LruCache算法回收掉。
磁盘缓存
算法:DiskLruCache
5. 回调机制
6. 图片处理
7. 网络请求
Glide默认使用的是HttpURLConnection进行网络请求
三 bitmap
1.一张图片真实的大小
磁盘大小
内存大小:图片高度 * 图片宽度 * 一个像素占用的内存大小
API: Bitmap.getAllocationByteCount()
ARGB_8888的一个像素占用4byte
一张ARGB_8888的Bitmap占用内存的计算公式: bitmapInRam = bitmapWidth * bitmapHeight * 4 bytes
2. Bitmap在内存当中占用的大小其实取决于:
色彩格式
原始文件存放的资源目录
目标屏幕的密度
3.Bitmap内存分配情况
4.图片加载到内存的过程
5.png,jpg,webp,gif
6.想办法减少Bitmap内存占用
https://zhuanlan.zhihu.com/p/20732309