问题来源:某一网友美团面试中问题投稿,这儿特意出一篇解析。

思考

首要咱们思考下美团中问该问题的意义:首要考察面试者对网络体系的全体了解状况。问题中有说到OkHttp,第一是掌握面试者对OkHttp原理的了解,第二也是了解面试者是否有自己的思维,而不是人云亦云都在用OkHttp,所以我也用。

怎么答复?

怎么建议网络恳求?

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

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

平常咱们所说的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的衔接池,减少了恳求延迟。

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

以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零根底入门到通晓,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )