Android面试整理(3)-图片相关

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

对比项PicassoGlideFresco
发布时间2013 年 5 月2014 年 9 月2015 年 5 月
是否支持 giffalsetruetrue
是否支持 webPtruetruetrue
视频缩略图falsetruetrue
大小100k500 KB2~3M
加载速度
Disk+Men Cachetruetruetrue
Easy of uselowmediundifficult
开发者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 的池子。

8.Fresco 源码分析

https://juejin.im/post/5a7568825188257a7a2d9ddb

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值