Android之OKhttp原理解析

本文深入剖析了Okhttp的工作流程,包括整体流程及各个拦截器的作用,如RetryAndFollowUpInterceptor的重定向处理、BridgeInterceptor的请求头设置等。此外,介绍了连接池原理,探讨了OkHttp中Dispatcher和线程池的管理方式,以及OkHttp设计模式的应用,展示了其在网络优化、扩展性方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录
  • okhttp工作的大致流程
  • okhttp中的连接
  • Dispatcher和线程池
  • OkHttp中的设计模式
  • OkHttp的优势
一、okhttp工作的大致流程
1、整体流程
  1. 当我们通过OkhttpClient创建一个Call,并发起同步或异步请求时;
  2. okhttp会通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,并通过execute()及enqueue()方法对同步或异步请求进行处理;
  3. execute()及enqueue()这两个方法会最终调用RealCall中的getResponseWithInterceptorChain()方法,从拦截器链中获取返回结果;
  4. 拦截器链中,依次通过RetryAndFollowUpInterceptor(重定向拦截器)、BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器)、ConnectInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。
    提供两张图便于理解和记忆:

在这里插入图片描述
在这里插入图片描述

这张图只画出了请求流程,没有数据返回流程,后期会处理。

2、各大拦截器的原理解析
2.1、RetryAndFollowUpInterceptor:负责重定向

构建一个StreamAllocation对象,然后调用下一个拦截器获取结果,从返回结果中获取重定向的request,如果重定向的request不为空的话,并且不超过重定向最大次数的话就进行重定向,否则返回结果。
注意:这里是通过一个while(true)的循环完成下一轮的重定向请求。

  • StreamAllocation为什么在第一个拦截器中就进行创建?
    答:便于取消请求以及出错释放资源。
  • StreamAllocation的作用是什么?
    答:StreamAllocation负责统筹管理Connection、Stream、Call三个实体类,具体就是为一个Call(Realcall),寻找( findConnection() )一个Connection(RealConnection),获取一个Stream(HttpCode)。

作用:

  • 在网络请求失败后进行重试
  • 当服务器返回当前请求需要进行重定向时直接发起新的请求,并在条件允许情况下复用当前连接
2.2、BridgeInterceptor

负责将原始Requset转换给发送给服务端的Request以及将Response转化成对调用方友好的Response。
具体就是对request添加Content-Type、Content-Length、cookie、Connection、Host、Accept-Encoding等请求头以及对返回结果进行解压、保持cookie等。
作用:

  • 设置内容长度,内容编码
  • 设置gzip压缩,并在接收到内容后进行解压。省去了应用层处理数据解压的麻烦
  • 添加cookie
  • 设置其他报头,如User-Agent,Host,Keep-alive等,其中Keep-Alive是实现多路复用的必要步骤</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值