简介
okhttp的有点:
1,支持SPDY协议,Http2.0共享一个socket来处理同一个服务器的请求
2,如果SPDY不可用则通过连接池来减少请求延迟
3,无缝支持GZIP来减少数据流量
4,缓存应用数据来减少网络请求
5,自动恢复网络连接
首先看我们的调用流程这里我们做一个简单的调用
1.首先我们构造一个Request
request中封装了url,请求方法,请求体等信息
2.创建一个OkhttpClient对象,通过okhttpClient.newCall()方法将request封装成一个Call
注意:这两句话牵扯到okhttp中最重要的两个类,Okhttpclient,RealCall OkHttpClient对象:网络请求的主要操控者OkHttpClient有很多的成员变量
3,RealCall是真正的请求执行者
RealCall又分为异步请求和同步请求,首先咱么来说一下异步请求,异步请求是通过RealCall的enqueue()方法来调取RealCall的异步请求
从源码中可以看到AsyncCall被传入Dispatcher分发器中,dispather中用连个AsyncCall集合 readyAsyncCalls 准备运行的 和 runningAsyncCalls正在运行的,如果正在运行的AsyncCall小于最大请求那么就直接加入正在运行的集合,然后调用AsyncCall的execute()方法
在getResponseWithInterceptorChain()中执行真正的请求
首先添加用户的所有拦截器,然后添加搭桥拦截器,Cache拦截器等然后proceed请求到response
然后根据retryAndFollowUpInterceptor.isCanceled()判断他是否请求成功返给Callback然后从dispather中的runningAsyncCalls删除掉当前这个syncCall,获取readyAsyncCalls中的一个Call放入runningAsyncCalls继续执行