异步请求流程
- 从这样一句话开始发出一个异步的请求
okHttpClient.newCall(request).enqueue(callback);
- 实际上调用的是 RealCall 的 enqueue 方法,将回调包装成一个 AsyncCall(NamedRunnabled的子类) 传递给了 Client 的 Dispatcher
|
|
- 每当 Dispatcher 收到一个新的 AsyncCall
- 如果有空闲的线程就去将其放入执行队列,并执行它
- 没有的话,就放入等待队列
|
|
AsyncCall 的执行过程通过
getResponseWithInterceptorChain()
来链式调用client.interceptors()
,从上到下层层包装了各种缓存、重试等机制,并添加部分默认的Headers参数等,最后调用到CallServerInterceptor.intercept(Chain chain)
方法和服务器建立 Socket 连接取得 Response,然后再把 Response 沿着来时的顺序由下往上层层返回,并进行相应的处理,最后返回到 AsyncCall 的 execute 方法中。然后相应的调用成功或失败的回调(还是在执行线程中,不会切换到主线程)
|
|
- 最后在
client.dispatcher().finished()
方法中会- 将该 AsyncCall 从执行队列中移除
- 调用
Dispatcher.promoteCalls()
方法来将等待队列中的 AsyncCall 放入执行队列中并执行
|
|
同步请求流程
这个会把 realCall 放到 dispatcher 的 runningSyncCalls 中,用于对请求的统一管理
并直接在当前线程调用getResponseWithInterceptorChain()
获得 Response
|
|