Okhttp源码1:框架

一、目录

二、目的

源码阅读的目的
1.发生请求的过程
2.接收响应的过程
3.网络操作的实现
4.缓存的实现
5.多路复用的实现

三、总体框架

在这里插入图片描述
上图是OkHttp的总体架构,大致可以分为以下几层:
1.Interface——接口层:接收网络的请求
2.Protocol——协议层:处理协议逻辑
3.Connection——连接层:管理网络连接,发送新的请求,接收服务器访问
4.Cache——缓存层:管理本地缓存
5.I/O层:实现数据的读写
6.Inteceptor——拦截层:拦截网络访问,插入拦截逻辑

四、每层含义

1.接口层——Interface

接口层接收用户的网络访问请求(异步/同步),发起实际的网络访问请求。OKHttpClient是OkHttp框架的客户端,更确切的说是用户的面板。用户使用OKHttp进行各种设置,发起各种网络请求都是通过OKHttpClient完成的。每个OkHttpClient内部都维护了属于自己的任务队列,连接池,Cache,拦截器等,所以在使用OkHttp作为网络框架时应该全局共享一个OkHttpClient实例。

Call描述了一个实际的访问请求,用户的每一个网络请求都是一个Call实例,Call本身是一个接口,定义了Call的接口方法,在实际执行过程中,OkHttp会为每一个请求创建一个RealCall,即Call的实现类。

Dispatcher是OkHttp的任务队列,其内部维护了一个线程池,当有接收到一个Call时,Dispatcher负责在线程池中找到空闲的线程并执行其execute方法。

2.协议层:处理协议逻辑——Protocol

Protocol层负责处理协议逻辑,OkHttp支持Http1/Http2/WebSocket协议,并在3.7版本中放弃了对Spdy协议,鼓励开发者使用Http/2。

3.连接层:管理网络连接,发送新的请求,接收服务器访问——Connection

连接层顾名思义就是负责网络连接,在连接层有一个线程池,统一管理所有Socke连接,当用户发起一个新的网络请求时,OKHttp会在连接池中找到是否有符合要求的连接,如果有则直接通过该连接发送网络请求;否则新创建一个网络连接。

RealConnection描述的是一个物理Socket连接,连接池中维护多个RealConnection实例,由于Http/2支持多路复用,一个RealConnection,所以OKhttp又引用了StreamAllocation来描述一个实际的网络请求开销(从逻辑上一个Stream对应一个call,但在实际网络请求过程中一个Call常常涉及到多个请求。如重定向,Authenticate等场景。所以准确地说,一个Stream对应一次请求,而一个Call对应一组有逻辑关联的Stream),一个RealConnection对应一个或者多个StreamAllocation,所以StreamAllocation,是以StreamAllocation可以看做是RealConnection的计数器,当RealConnection的引用计数变为0,且长时间没有被其他请求重新占用就将被释放。

4.缓存层:管理本地缓存——Cache

Cache层负责维护请求缓存,当用户的网络请求在本地已有符合要求的缓存时,OKHttp会直接从缓存中返回结果,从而节省 网络开销。

5.拦截器层:拦截网络访问,插入拦截逻辑——Inteceptor

拦截层提供一个类AOP接口,方便用户可以切入到各个层面对网络访问进行拦截并执行相关逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值