【Android开源框架面试题】Android如何发起网络请求,你有用过相关框架码?OkHttp框架解决了你什么问题?

Android如何发起网络请求,你有用过相关框架码?OkHttp框架解决了你什么问题?(美团)

这道题想考察什么?

对网络体系的整体了解情况。问题中有提到OkHttp,第一是掌握面试者对OkHttp原理的了解,第二也是了解面试者是否有自己的思想,而不是人云亦云都在用OkHttp,所以我也用。

考察的知识点

网络编程,OkHttp原理

考生如何回答
如何发起网络请求?

现在绝大多数的网络交互采用的是Http协议,也有同学使用过webSocket、ftp等协议。首先什么是协议,这些协议之间是什么关系,他们和TCP/IP又有什么关系?

在这里插入图片描述

平时我们所说的Http也好还是WebSocket也要,都是属于应用层协议。应用层负责的工作主要就是定义数据格式,制定通信双方采用何种数据格式通信。比如我们平时使用中文交流,就需要按照中文的语法组织语言,否则通信的另一方无法理解。

而应用层需要借助下层,传输层进行数据的传输,传输层需要传输数据同样需要使用下层的网络层完成寻址,确定要把数据传到哪个地址,传给谁。我们平时说的TCP协议就是传输层协议,而IP协议则是网络层协议。

写网络程序就必须用Socket,这是程序员都知道的,实际上socket就是对TCP/IP协议的封装。也就是说Http需要先利用Socket建立TCP/IP连接,然后就可以使用Socket读写数据,这个数据需要按照Http协议的规则、语义去封装与解析,这样就完成了Http的通信。如果按照WebSocket的规则定制数据,就是在完成WebSocket的通信。

OkHttp解决了你什么问题?

一般而言,我们都会借助一些框架来完成这个网络交互,OkHttp就是一个能够帮助我们完成网络通信的框架之一。借助OkHttp能否完成Http1.x、Http2.0以及WebSocket的通信。

连接池

首先OkHttp帮我们封装了Socket,提供更加简单的API让我们完成网络请求,同时OkHttp也根据协议规则,帮我们实现Socket的连接池,减少了请求延迟。

在这里插入图片描述

以Http协议为例,Http协议需要首先建立Socket连接(即TCP/IP连接),同时我们了解到TCP/IP连接需要进行三次握手,断开连接需要完成四次挥手。在完成了对某一域名的Socket连接之后,借助此Socket来进行Http数据的交互。那么第一次交互完成之后,如果需要进行与此域名的第二次交互,就可以利用前一次的Socket连接进行。因此OkHttp维护一个连接对象(Socket对象)复用池,在需要发起网络交互前,先尝试从对象池中查找是否有与本次请求的域名建立好的有效Socket连接,如果有,就不需要再去进行三次握手建立新的Socket连接。

Gzip压缩

第二,在进行数据传输时,我们都能够理解,传输的数据量越小,所需要花费的时间自然越短。因此OkHttp在发起请求时,默认会配置一个Http请求头:Accept-Encoding: gzip,此请求头告知服务器,可以将响应数据使用gzip压缩。

响应缓存

OkHttp也能够为我们自动根据协议规则缓存响应,在发起请求之前,OkHttp也会根据协议规则判断是否允许使用缓存,如果能够使用缓存,则可以不与服务器发起网络交互,直接将以前请求的缓存返回给使用者。但是需要主义的是,OkHttp缓存需要我们主动开启,同时只会对GET请求缓存。

其他

当然OkHttp还帮我们完成了以简单的配置完成对协议的处理,比如Cookie,DNS服务器,代理等等都只需要一个API就能完成对这些内容的配置与使用。

以上说明的都是OkHttp通用的介绍,其实我们为什么要用OkHttp?或者OkHttp帮我们解决了什么问题?没有太多的原因,就是单纯的okhttp提供的接口更友好,功能也齐全。另外多人开发一个项目的时候,因为每个人有自己的编码风格,单单一个网络访问,每个人都有不同的写法和封装。在一个项目中,这种代码必然是冗余的。而使用公开的框架,能够把大家的能力尽可能拉平到一条线上,避免一些基础错误。

同时还有些面试官可能会问:你觉得OkHttp有什么缺点?

这个问题有些同学会回答:OkHttp不能把响应切回主线程;OkHttp的调用还是比较麻烦;嵌套请求不方便。其实在我看来,这些不应该说是OkHttp的缺点。

OkHttp是一个Java框架,并不是专用于Android。而且OkHttp的定位应该是一个网络基础功能库,它不需要考虑我们的业务场景是否需要嵌套调用,是否需要切换线程。如果考虑到业务我们应该在功能库的基础上自行完成封装,比如Retrofit就完成了对OkHttp的封装。

最后

我整理了一套Android面试题合集,除了以上面试题,还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES
在这里插入图片描述

有需要的朋友可以扫描下方二维码,免费领取全部面试题+答案解析!!!

猜你喜欢

转载自blog.csdn.net/datian1234/article/details/135138428