1.首先通过Build模式创建了 OKhttpclient 和Request
2.然后通过client.newCall(res)创建了 call对象RealCall
3.Realall可以通过execute 和 enqueue 执行同步方法
同步execute
1.会先判断这个链接是否是第一次 不是抛出异常
2.会调用dispat.excute 分发 将这次请求加入同步队列中
3.执行拦截链
4返回response
5.调用dispather.finished j将这次请求移除 runningSysCalls队列
6.重新计算 正在运行的请求数(runningSysCalls.size+RunningAsyncCalls.size)
7.调用 idlecall.run关闭
异步enqueue
1.会先判断这个链接是否是第一次 不是抛出异常
2.调用dispatcher().enqueue()
2.1会先判断 当前运行 的 异步队列数 是否小于64 再判断当前运行主机数是否《5
满足 加入 runningAsyncCall 并开始线程池executorService执行
不满足 加入readAsyncCall 队列
2.2
3因为AsyncCall 是一个runanble 最终调用了realCall的execute
1.会先调用 getResponseWithInterceptorChain 获取responese
2.如果判断是否取消 是否失败 是否异常 来走 onFailure
还是走OnResponse
4.调用 dispather.finsh 关闭
4.1 会先把当前请求移除 异步运行队列
4.2调用promote 来重新调整异步队列
4.21 会先判断当前主机运行数量是否<5
然后判断readAsyncCalls队列中是否还有待执行请求
如果有 就加入 RunningAsyncCalls队列
当RunningAsyncCalls.size数量 》64就停止加入
4.3 然后重新计算运行请求数量
4.3当运行数量为0 释放资源