一、图片
1、图片库对比
juejin.im/post/684490…
Picasso Glide Fresco
Picasso 毕加索 Square
•使用简单,代码简洁
•与Square其他类库搭配兼容性好,Retrofit OkHttp 等
缺点:
•功能简单 图片加载
•性能(加载速度等等)较(Glide、Fresco)差
•自身没有实现"本地缓存"
Glide Google 开源
•支持Memory和Disk缓存
•Picasso 只会缓存原始尺寸图片,而Glide缓存时多种规格
•内存开销小,默认 RGB_565,Picasso 默认是 ARGB_8888
缺点:
•使用方法复杂,实现方法较多
•使用比Fresco简单,但性能(加载&缓存)却比不上 Fresco
Fresco Facebook
•大大减少OOM,底层使用C++技术解决图片缓存问题
•使用加单,几乎全部功能都能在 xml 上定制
缺点:
•用法变得更加复杂
•依赖包更大了 2~3M
•底层C++,阅读源码困难
详细属性对比
//同样在DataSubscriber中获取
FileBinaryResource resource = (FileBinaryResource) Fresco.getImagePipelineFactory().getMainFileCache().getResource(new SimpleCacheKey(url));
if (resource != null && resource.getFile() != null) {
setImage(ImageSource.uri(Uri.fromFile(resource.getFile())));
}
2、LRUCache原理
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、图片加载原理
4、自己去实现图片库,怎么做?
做?
5、Glide源码解析
无论使用什么参数,最终都会进入如下三个方法创建 RequestManager
结论:
•Activity–FragmentManager–RequestManagerFragment–RequestManager,所以一个 Activity 对应一个 RequestManager
•一个 Fragment 对应一个 RequestManager
•Activity 包含 Fragment,Fragment 包含 Fragment,若分别创建 Glide 请求是并不会只创建一个 Requ
estManager 的
•子线程发起 Glide 请求或传入对象为 ApplicationContext ,则使用全局单例的 RequestManager
6、Glide使用什么缓存
7、Glide内存缓存如何控制大小?
一种是Resource缓存,一类是Bitmap缓存。
Resource缓存: 图片从网络加载,将图片缓存到本地,当需要再次使用时,直接从缓存中取出而无需再次请求网络。
Glide在缓存Resource使用三层缓存,包括:
一级缓存:缓存被回收的资源,使用LRU算法(Least Frequently Used,最近最少使用算法)。当需要再次使用到被回收的资源,直接从内存返回。
二级缓存:使用弱引用缓存正在使用的资源。当系统执行gc操作时,会回收没有强引用的资源。使用弱引用缓存资源,既可以缓存正在使用的强引用资源,也不阻碍系统需要回收无引用资源。
三级缓存:磁盘缓存。网络图片下载成功后将以文件的形式缓存到磁盘中。
Bitmap缓存 通过Bitmap压缩质量参数:Glide默认使用RGB_565,比系统默认使用的ARGB_8888节省一半的资源,但RGB_565无法显示透明度。
Bitmap缓存算法:
8.Fresco 源码分析
private static final String CONTENT_FILE_EXTENSION = “.cnt”; private static final String TEMP_FILE_EXTENSION = “.tmp”;
未解码图片内存缓存:由EncodedImage描述真正的缓存对象。 已解码图片内存缓存:由BitmapMemoryCache描述真正的缓存对象。