一、图片

参考答案:
1、图片库对比
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++,阅读源码困难

详细属性对比


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源码解析

结论:
•Activity--FragmentManager--RequestManagerFragment--RequestManager,所以一个 Activity 对应一个 RequestManager
•一个 Fragment 对应一个 RequestManager
•Activity 包含 Fragment,Fragment 包含 Fragment,若分别创建 Glide 请求是并不会只创建一个 RequestManager 的
•子线程发起 Glide 请求或传入对象为 ApplicationContext ,则使用全局单例的 RequestManager
创建 RequestBuilder 的 load 方法有很多:


6、Glide使用什么缓存?

7、Glide内存缓存如何控制大小?
一种是Resource缓存,一类是Bitmap缓存。
Resource缓存: 图片从网络加载,将图片缓存到本地,当需要再次使用时,直接从缓存中取出而无需再次请求网络。
Glide在缓存Resource使用三层缓存,包括:

网友评论