Okhttp的全解析(1)
转载请申明出处:https://blog.****.net/yuezheyue123/article/details/80688244
本文出自[云遮月的博客]
1、通过Response response = client.newCall(request).execute();
调用newCall()
方法
2、newCall()
方法实际调用RealCall.newRealCall(this, request, false )
, 返回的就是ReallCall 继承与Call表示的是一个请求的模型。这样就将Request请求封装进了RealCall对象中,然后调用excute
方法进行请求。
3、excute()
方法中主要。client.dispatcher().executed(this)
,然后首先是调用getResponseWithInterceptorChain()
方法获取响应,然后获取成功后,就调用回调的onReponse
方法,如果失败,就调用回调的onFailure()
。最后,调用Dispatcher的finished()
。
4、这里client.dispatcher()
会获取Dispatcher类 这个是一个线程池调度器,里面主要是封装了准备请求,同步,异步等请求的队列。调用excuted()
方法就是将请求添加到Queue中。
5、在Dispatcher中会创建ExecutorService
线程池,并且暴露了executorService()
方法获取线程池。获取线程池后添加数据到队列并执行是在Socket连接成功后调用,后面再说。
6、RellCall类中的excute()
方法中getResponseWithInterceptorChain()
方法去获取响应的结果
1)在配置 OkHttpClient 时设置的 interceptors;
2)负责失败重试以及重定向的 RetryAndFollowUpInterceptor;
3)负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的响应转换为用户友好的响应的 BridgeInterceptor;
4)负责读取缓存直接返回、更新缓存的 CacheInterceptor;
5)负责和服务器建立连接的 ConnectInterceptor;
6)配置 OkHttpClient 时设置的 networkInterceptors;
7)负责向服务器发送请求数据、从服务器读取响应数据的 CallServerInterceptor。
先是进行设置了一些拦截器,然后将request进一步封装进RealInterceptorChain.然后调用proceed()
方法。
7、由于第一次处理时候,index是0,自增之后,首先调用的是BridgeInterceptor类的intercept
方法。
然后将请求的信息进一步的封装,包括Content-Type
,Content-Length
等等。然后
然后接着调用chain.proceed()
方法循环遍历,直到所有的interceptor
都遍历完成为止。
8、然后看ConnectInterceptor拦截器,这个比较重要,在streamAllocation.newStream()
中创建了Socket的对象,newStream()
—>findHealthyConnection()
–>findConnection()
–>result.connect()
—>connectSocket()
–>rawSocket
=.....new Socket(proxy)
9、然后执行CallServelInterceptor拦截器,负责将请求交给服务器。调用finishRequest()
方法将请求发送给服务器。
然后获取数据响应