OkHttp源码解析

OkHttpClient.Builder

addInterceptor()

添加拦截器到list中

build()

创建OkHttpClient对象

RequestBody

抽象类,需要实现两个方法


  /** Returns the Content-Type header for this body. */
  abstract fun contentType(): MediaType?
  /** Writes the content of this request to [sink]. */
  @Throws(IOException::class)
  abstract fun writeTo(sink: BufferedSink)

FormBody:RequestBody

提供builder快速创建,内部含有两个list存储传入的namevalue,并将其转码

实现父类方法:

  1. contentType = "application/x-www-form-urlencoded".toMediaType()
  2. 按照&name=value格式写入

MultipartBody:RequestBody

提供builder快速创建

实现父类方法:

  1. contentType = "类型; boundary=输入的类型".toMediaType()
  2. 按照--输入的类型\r\nname: value\r\nContent-Type: 当前类型\r\nContent-Length: 当前长度\r\n\r\n内容\r\n--输入的类型--\r\n格式写入

Request.Builder()

url()

缓存URL

get()

设置方法名称为GET,将方法体设置为null

post(body)

设置方法名称为POST,将方法体设置为body

build()

创建Request对象,限制url不能为null

OkHttpClient().newCall()

创建RealCall对象,传入client和request

RealCall.enqueue

实现Runnable接口实现execute功能
在线程池中调用,添加到list中,在取消时统一移除

RealCall.execute

  1. 检查是否已经启动
  2. 启动超时控制器,达到超时时间,关闭链接
  3. 触发启动监听
  4. 缓存正在运行的链接
  5. 执行getResponseWithInterceptorChain()
    1. 获取所有拦截器
    2. 将信息包装为RealInterceptorChain对象
    3. 执行proceed
    4. 如果取消了,抛出异常
  6. 捕获异常,释放链接
  7. finally块如果没有异常,释放链接

拦截器

调用顺序:

  1. 用户定义的全局
  2. RetryAndFollowUpInterceptor(最大数量MAX_FOLLOW_UPS=20)
  3. BridgeInterceptor(设置头并压缩数据)
  4. CacheInterceptor(查寻是否有缓存,查询是否过期等,有则用缓存)
  5. ConnectInterceptor 遍历连接池,获取一个链接健康的链接
  6. 自定义的networkInterceptors(如果时websocket)
  7. CallServerInterceptor(写入请求头信息;写入请求体信息;结束请求;读取响应头信息;获取响应体信息输入流)

责任链模式,每个拦截器执行自己后,执行递归方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值