图片相关
1、图片库对比
https://juejin.im/post/5c9e0feb6fb9a05e2b23ed4d
1.1 Picasso
Picasso 毕加索 Square
Picasso 没有实现本地缓存功能,交给了 Square 的另外一个网络库 okhttp 去实现,
这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制
图片的过期时间。
优点
- 使用简单,代码简洁
- 与 Square 其他类库搭配兼容性好,Retrofit OkHttp 等
缺点:
- 功能简单 图片加载
- 性能(加载速度等等)较(Glide、Fresco)差
- 自身没有实现"本地缓存"
1.2 Glide
Glide Google 开源
- 支持 Gif WebP Video
- 生命周期继承 高效缓存策略
- 支持 Memory 和 Disk 缓存
- Picasso只会缓存原始尺寸图片,而 Glide 缓存时多种规格 内存开销小,默认 RGB_565,Picasso 默认是 ARGB_8888
缺点:
- 使用方法复杂,实现方法较多
- 使用比 Fresco 简单,但性能(加载&缓存)却比不上 Fresco
1.3 Fresco
Fresco Facebook
- 大大减少 OOM,底层使用 C++技术解决图片缓存问题
- 使用加单,几乎全部功能都能在 xml 上定制
缺点:
- 用法变得更加复杂
- 依赖包更大了 2~3M
- 底层 C++,阅读源码困难
https://juejin.im/entry/5af9aabf51882542bd69d0c0
对比项 | Picasso | Glide | Fresco |
---|---|---|---|
发布时间 | 2013 年 5 月 | 2014 年 9 月 | 2015 年 5 月 |
是否支持 gif | false | true | true |
是否支持 webP | true | true | true |
视频缩略图 | false | true | true |
大小 | 100k | 500 KB | 2~3M |
加载速度 | 中 | 高 | 高 |
Disk+Men Cache | true | true | true |
Easy of use | low | mediun | difficult |
开发者 | Square 主导 | Google 主导 | Facebook 主导 |
2、LRUCache 原理
https://blog.csdn.net/u010983881/article/details/79050209
LruCache DiskLruCache
LruCache 是 Android 3.1 所提供的一个缓存类 DisLruCache 目前在 Android 还不是
Android SDK 的一部分,但 Android 官方文档推荐使用该算法来实现硬盘缓存。
LinkedHashMap 它使用了一个双向链表来存储 Map 中的 Entry 顺序关系,这种顺
序有两种,一种是 LRU 顺序,一种是插入顺序
put()重要的就是在添加过缓存对象后,调用 trimToSize()方法,来判断缓存是否
已满,如果满了就要删除近期最少使用的算法。
trimToSize()方法不断地删除 LinkedHashMap 中队头的元素,即近期最少访问的,
直到缓存大小小于最大值
LruCache 中维护了一个集合 LinkedHashMap,该 LinkedHashMap 是以访问顺序排
序的。当调用 put()方法时,就会在结合中添加元素,并调用 trimToSize()判断缓
存是否已满,如果满了就用 LinkedHashMap 的迭代器删除队头元素,即近期最少
访问的元素。当调用 get()方法访问缓存对象时,就会调用 LinkedHashMap 的 get()
方法获得对应集合元素,同时会更新该元素到队尾。
3、图片加载原理
https://www.jianshu.com/p/1d0bfbdaab17
4、自己去实现图片库,怎么做?
图片的同步加载
图片的异步加载
图片压缩
内存缓存
磁盘缓存
网络拉取
从这几个方面回答。
5、Glide 源码解析
https://www.jianshu.com/p/9bb50924d42a
6、Glide 使用什么缓存?
https://www.jianshu.com/p/62b7f990ee83
BitmapPool 大小通过 MemorySizeCalculator 设置;
使用 LRU 算法维护 BitmapPool ;
Glide 会根据 Bitmap 的大小与 Config 生成一个 Key;
Key 也有自己对应的对象池,使用 Queue 实现;
数据最终存储在 GroupedLinkedMap 中;
GroupedLinkedMap 使用哈希表、循环链表、List 来存储数据。
7、Glide 内存缓存如何控制大小?
https://blog.csdn.net/github_37130188/article/details/89390533
一种是 Resource 缓存,一类是 Bitmap 缓存。
1、Resource 缓存: 图片从网络加载,将图片缓存到本地,当需要再次使用时,直
接从缓存中取出而无需再次请求网络。
Glide 在缓存 Resource 使用三层缓存,包括:
一级缓存:缓存被回收的资源,使用 LRU 算法(Least Frequently Used,最近最少使用算
法)。当需要再次使用到被回收的资源,直接从内存返回。
二级缓存:使用弱引用缓存正在使用的资源。当系统执行 gc 操作时,会回收没有强引用的资源。
使用弱引用缓存资源,既可以缓存正在使用的强引用资源,也不阻碍系统需要回收无引用资源。
三级缓存:磁盘缓存。网络图片下载成功后将以文件的形式缓存到磁盘中。
2、Bitmap 缓存 通过 Bitmap 压缩质量参数:Glide 默认使用 RGB_565,比系统默认
使用的 ARGB_8888 节省一半的资源,但 RGB_565 无法显示透明度。
Bitmap 缓存算法:
在 Glide 中,使用 BitmapPool 来缓存 Bitmap,使用的也是 LRU 算法。
当需要使用 Bitmap 时,从 Bitmap 的池子中取出合适的 Bitmap,若取不到合适的,则再新创
建。
当 Bitmap 使用完后,不直接调用 Bitmap.recycler()回收,而是放入 Bitmap 的池子。