初始化
- 先 builder 创建 OkHttpClient
- 再 builder 创建 Request
- 然后 RealCall.newRealCall(request) 创建请求
- 最后 realCall.execute 执行
- 或者 realCall.enqueue 加入队列执行(走线程池)
异步调用
异步是传入回调封装成AsyncCall,然后将其加入到线程池里 ThreadPollExecutor.execute(call) 最终和同步一样,请求执行的方法是 getResponseWithInterceptorChain,同步的结果直接return。
这个方法里主要是处理interceptor拦截器,先加上自定义的所有拦截器,再加上系统预设的几个拦截器:
- retryAndFollowUpInterceptor——失败和重定向过滤器
- BridgeInterceptor——封装request和response过滤器。设置header、解析gzip等
- CacheInterceptor——缓存相关的过滤器,负责读取缓存直接返回、更新缓存
- ConnectInterceptor——负责和服务器建立连接,连接池等
- networkInterceptors——配置 OkHttpClient 时设置的 networkInterceptors
- CallServerInterceptor——负责向服务器发送请求数据、从服务器读取响应数据(实际网络请求)
拦截器加好后,开始执行
1
RealInterceptorChain.proceed(request)
这个方法里会先获取第一个拦截器,然后调用其 interceptor.intercept(next),这里的next是集合里下一个拦截器。
到自定义拦截器or预设的拦截器里可以看到,里面通常会再调用 chan.proceed(request) 形成递归调用链。
和Retrofit2的结合
Retrofit部分异步是借助 RxJava 实现的, .subscribeOn(Schedule.io()) 没用OkHttpClient的线程池
配图
网上找的
OkHttp3源码部分只简单看了下,研究的比较浅。不过大概知道原理了,有进一步需求的可以网上找其他文章看下。