android app面试题,Android中原理型面试题三道,答案有点长

今天分享给大家三道Android中原理型面试题,希望大家对这几道原理型面试题有一个深刻的了解。切记看完题目先思考再查看答案哦。

Android原理型面试题一:谈谈对Okhttp的理解

Volley与OkHttp的对比:

Volley:支持HTTPS。缓存、异步请求,不支持同步请求。协议类型是Http/1.0, Http/1.1,网络传输使用的是

HttpUrlConnection/HttpClient,数据读写使用的IO。

OkHttp:支持HTTPS。缓存、异步请求、同步请求。协议类型是Http/1.0, Http/1.1, SPDY, Http/2.0,

WebSocket,网络传输使用的是封装的Socket,数据读写使用的NIO(Okio)。

SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。SPDY协议通过压缩、多路复用和优先级来缩短加载时间。

Okhttp的子系统层级结构图如下所示:

a6a8793c745f158972da4757cabe206f.png

400653edd83df2f4f643c392ec176764.png

网络配置层:利用Builder模式配置各种参数,例如:超时时间、拦截器等,这些参数都会由Okhttp分发给各个需要的子系统。

重定向层:负责重定向。

Header拼接层:负责把用户构造的请求转换为发送给服务器的请求,把服务器返回的响应转换为对用户友好的响应。

HTTP缓存层:负责读取缓存以及更新缓存。

连接层:连接层是一个比较复杂的层级,它实现了网络协议、内部的拦截器、安全性认证,连接与连接池等功能,但这一层还没有发起真正的连接,它只是做了连接器一些参数的处理。

数据响应层:负责从服务器读取响应的数据。

在整个Okhttp的系统中,我们还要理解以下几个关键角色:

OkHttpClient:通信的客户端,用来统一管理发起请求与解析响应。

Call:Call是一个接口,它是HTTP请求的抽象描述,具体实现类是RealCall,它由CallFactory创建。

Request:请求,封装请求的具体信息,例如:url、header等。

RequestBody:请求体,用来提交流、表单等请求信息。

Response:HTTP请求的响应,获取响应信息,例如:响应header等。

ResponseBody:HTTP请求的响应体,被读取一次以后就会关闭,所以我们重复调用responseBody.string()获取请求结果是会报错的。

Interceptor:Interceptor是请求拦截器,负责拦截并处理请求,它将网络请求、缓存、透明压缩等功能都统一起来,每个功能都是一个Interceptor,所有的Interceptor最

终连接成一个Interceptor.Chain。典型的责任链模式实现。

StreamAllocation:用来控制Connections与Streas的资源分配与释放。

RouteSelector:选择路线与自动重连。

RouteDatabase:记录连接失败的Route黑名单。

Android原理型面试题二:谈谈对Fresco理解?

Fresco与Glide的对比:

Glide:相对轻量级,用法简单优雅,支持Gif动态图,适合用在那些对图片依赖不大的App中。

Fresco:采用匿名共享内存来保存图片,也就是Native堆,有效的的避免了OOM,功能强大,但是库体积过大,适合用在对图片依赖比较大的App中。

DraweeView:继承于ImageView,只是简单的读取xml文件的一些属性值和做一些初始化的工作,图层管理交由Hierarchy负责,图层数据获取交由负责。

DraweeHierarchy:由多层Drawable组成,每层Drawable提供某种功能(例如:缩放、圆角)。

DraweeController:控制数据的获取与图片加载,向pipeline发出请求,并接收相应事件,并根据不同事件控制Hierarchy,从DraweeView接收用户的事件,然后执行取消网络请求、回收资源等操作。

DraweeHolder:统筹管理Hierarchy与DraweeHolder。

ImagePipeline:Fresco的核心模块,用来以各种方式(内存、磁盘、网络等)获取图像。

Producer/Consumer:Producer也有很多种,它用来完成网络数据获取,缓存数据获取、图片解码等多种工作,它产生的结果由Consumer进行消费。

IO/Data:这一层便是数据层了,负责实现内存缓存、磁盘缓存、网络缓存和其他IO相关的功能。

纵观整个Fresco的架构,DraweeView是门面,和用户进行交互,DraweeHierarchy是视图层级,管理图层,DraweeController是控制器,管理数据。它们构成了整个Fresco框架的三驾马车。当然还有我们

幕后英雄Producer,所有的脏活累活都是它干的,最佳劳模

理解了Fresco整体的架构,我们还有了解在这套矿建里发挥重要作用的几个关键角色,如下所示:

Supplier:提供一种特定类型的对象,Fresco里有很多以Supplier结尾的类都实现了这个接口。

SimpleDraweeView:这个我们就很熟悉了,它接收一个URL,然后调用Controller去加载图片。该类继承于GenericDraweeView,GenericDraweeView又继承于DraweeView,DraweeView是Fresco的顶层View类。

PipelineDraweeController:负责图片数据的获取与加载,它继承于AbstractDraweeController,由PipelineDraweeControllerBuilder构建而来。AbstractDraweeController实现了DraweeController接口,DraweeController

是Fresco的数据大管家,所以的图片数据的处理都是由它来完成的。

GenericDraweeHierarchy:负责SimpleDraweeView上的图层管理,由多层Drawable组成,每层Drawable提供某种功能(例如:缩放、圆角),该类由GenericDraweeHierarchyBuilder进行构建,该构建器

将placeholderImage、retryImage、failureImage、progressBarImage、background、overlays与pressedStateOverlay等

xml文件或者Java代码里设置的属性信息都传入GenericDraweeHierarchy中,由GenericDraweeHierarchy进行处理。

DraweeHolder:该类是一个Holder类,和SimpleDraweeView关联在一起,DraweeView是通过DraweeHolder来统一管理的。而DraweeHolder又是用来统一管理相关的Hierarchy与Controller

DataSource:类似于Java里的Futures,代表数据的来源,和Futures不同,它可以有多个result。

DataSubscriber:接收DataSource返回的结果。

ImagePipeline:用来调取获取图片的接口。

Producer:加载与处理图片,它有多种实现,例如:NetworkFetcherProducer,LocalAssetFetcherProducer,LocalFileFetchProducer。从这些类的名字我们就可以知道它们是干什么的。

Producer由ProducerFactory这个工厂类构建的,而且所有的Producer都是像Java的IO流那样,可以一层嵌套一层,最终只得到一个结果,这是一个很精巧的设计

Consumer:用来接收Producer产生的结果,它与Producer组成了生产者与消费者模式。

注:Fresco源码里的类的名字都比较长,但是都是按照一定的命令规律来的,例如:以Supplier结尾的类都实现了Supplier接口,它可以提供某一个类型的对象(factory,

generator, builder, closure等)。 以Builder结尾的当然就是以构造者模式创建对象的类。

Android原理型面试题三:EventBus是如何做到发送粘性消息的?

EventBus里有一个HashMap用来存储粘性事件队列,当注册事件时,如果该事件是粘性事件,则从该队列中取出最后一个该类型的事件并发送给订阅者。

恭喜你,了解了这三道Android中原理型面试题,虽然答案有点长,但相信带你了更多的思考。其实在Android面试的过程中你还会碰到别的各种面试问题,想要全都了解吗?来达内Android培训班模拟练习吧!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值