图片处理

本文深入探讨Glide图片加载库的工作原理,包括其内存和磁盘缓存策略,使用LinkedHashMap实现LruCache算法,以及如何根据上下文生命周期管理图片加载任务。此外,还详细介绍了Glide的线程池策略、回调机制、图片处理和网络请求方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一,图片处理框架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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值