2020 Android 大厂面试(一)

简介: 1、图片库对比juejin.im/post/684490…Picasso Glide FrescoPicasso 毕加索 Square

一、图片

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描述真正的缓存对象。


相关文章
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
94 6
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
31 3
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
27 2
|
2月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
58 1
|
2月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
43 1
|
2月前
|
存储 缓存 网络协议
5个Android性能优化相关的深度面试题
本文涵盖五个Android面试题及其解答,包括优化应用启动速度、内存泄漏的检测与解决、UI渲染性能优化、减少内存抖动和内存溢出、优化网络请求性能。每个问题都提供了详细的解答和示例代码。
31 2
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制