当美团中问道:Android如何发起网络请求,你有用过相关框架码?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老皮

解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

相关推荐
着迷不白13 小时前
Linux单用户模式密码修改与硬盘注释指南
面试
奔跑中的蜗牛66613 小时前
一次播放器架构升级:Android 直播间 ANR 下降 60%
android
有意义13 小时前
深度拆解分割等和子集:一维DP数组与倒序遍历的本质
前端·算法·面试
测试工坊15 小时前
Android 视频播放卡顿检测——帧率之外的第二战场
android
我叫黑大帅15 小时前
Go 语言中处理「未知类型数据」的两大核心手段
后端·面试·go
Kapaseker16 小时前
一杯美式深入理解 data class
android·kotlin
鹏多多16 小时前
Flutter使用screenshot进行截屏和截长图以及分享保存的全流程指南
android·前端·flutter
Carson带你学Android16 小时前
OpenClaw移动端要来了?Android官宣AI原生支持App Functions
android
拉不动的猪16 小时前
重温Vue异步更新队列
前端·javascript·面试
黄林晴16 小时前
Android 删了 XML 预览,现在你必须学 Compose 了
android