美文网首页Android开发经验谈
Android 大厂面试(一)

Android 大厂面试(一)

作者: 椰果玩安卓 | 来源:发表于2020-08-07 20:56 被阅读0次

一、图片


888888888.png

参考答案:

1、图片库对比

Picasso Glide Fresco

Picasso 毕加索 Square


888888888.png

•使用简单,代码简洁
•与Square其他类库搭配兼容性好,Retrofit OkHttp 等

缺点:
•功能简单 图片加载
•性能(加载速度等等)较(Glide、Fresco)差
•自身没有实现"本地缓存"
Glide Google 开源


888888888.png

•支持Memory和Disk缓存
•Picasso 只会缓存原始尺寸图片,而Glide缓存时多种规格
•内存开销小,默认 RGB_565,Picasso 默认是 ARGB_8888

缺点:
•使用方法复杂,实现方法较多
•使用比Fresco简单,但性能(加载&缓存)却比不上 Fresco

Fresco Facebook
•大大减少OOM,底层使用C++技术解决图片缓存问题
•使用加单,几乎全部功能都能在 xml 上定制

缺点:
•用法变得更加复杂
•依赖包更大了 2~3M
•底层C++,阅读源码困难


888888888.png

详细属性对比


888888888.png
888888888.png

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、自己去实现图片库,怎么做?

888888888.png

5、Glide源码解析

888888888.png

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

创建 RequestBuilder 的 load 方法有很多:


888888888.png
888888888.png

6、Glide使用什么缓存?

888888888.png

7、Glide内存缓存如何控制大小?

一种是Resource缓存,一类是Bitmap缓存。

Resource缓存: 图片从网络加载,将图片缓存到本地,当需要再次使用时,直接从缓存中取出而无需再次请求网络。

Glide在缓存Resource使用三层缓存,包括:


888888888.png

相关文章

网友评论

    本文标题:Android 大厂面试(一)

    本文链接:https://www.haomeiwen.com/subject/gvvwrktx.html