征服面试官:OkHttp 原理篇 掌握这篇面试题汇总,吊打面试官!

本文详细介绍了OkHttp的基本实现原理,包括连接池、网络缓存和连接复用,同时解析了Dispatcher的角色。还深入探讨了addInterceptor与addNetworkInterceptor的区别,以及OkHttp拦截器的应用。此外,文章还提到了OkHttp的优势,如连接复用、http2支持和响应缓存等,并解答了为什么response.body().string()只能调用一次的问题。通过对OkHttp设计模式的分析,如构造者、工厂、单例、策略、责任链和享元模式,帮助读者深入理解其内部工作机制。
摘要由CSDN通过智能技术生成

前言

如今面试中高级开发工程师岗位,OKhttp 原理是必问环节,只会使用已经无法满足 Android 开发市场的需求,优秀的第三方框架源码剖析不仅能深度理解框架,也能对自己学习带来很大的帮助。

本篇文章根据朋友反馈和亲身经历简单整理的一些关于 Okhttp 常见面试题目。

1.Okhttp 基本实现原理

OkHttp 主要是通过 5 个拦截器和 3 个双端队列(2 个异步队列,1 个同步队列)工作。内部实现通过一个责任链模式完成,将网络请求的各个阶段封装到各个链条中,实现了各层的解耦。

OkHttp 的底层是通过 Socket 发送 HTTP 请求与接受响应,但是 OkHttp 实现了连接池的概念,即对于同一主机的多个请求,可以公用一个 Socket 连接,而不是每次发送完 HTTP 请求就关闭底层的 Socket,这样就实现了连接池的概念。而 OkHttp 对 Socket 的读写操作使用的 OkIo 库进行了一层封装。

执行流程

  • 通过构建者构建出OkHttpClient对象,再通过newCall方法获得RealCall请求对象.

  • 通过RealCall发起同步或异步请求,而决定是异步还是同步请求的是由线程分发器dispatcher来决定.

  • 当发起同步请求时会将请求加入到同步队列中依次执行,所以会阻塞UI线程,需要开启子线程执行.

  • 当发起异步请求时会创建一个线程池,并且判断请求队列是否大于最大请求队列64,请求主机数是否大于5,如果大于请求添加到异步等待队列中,否则添加到异步执行队列,并执行任务.

2.Okhttp 网络缓存如何实现?

OKHttp 默认只支持 get 请求的缓存。

  • 第一次拿到响应后根据头信息决定是否缓存。
  • 下次请求时判断是否存在本地缓存,是否需要使用对比缓存、封装请求头信息等等。
  • 如果缓存失效或者需要对比缓存则发出网络请求,否则使用本地缓存。

3.Okhttp 网络连接怎么实现复用?

HttpEngine 在发起请求之前,会先调用nextConnection()来获取一个Connection对象,如果可以从ConnectionPool中获取一个Connection对象,就不会新建,如果无法获取,就会调用createnextConnect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值