Okhttp的全解析(1)

转载请申明出处:https://blog.csdn.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()。最后,调用Dispatcherfinished()

    这里写图片描述

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-TypeContent-Length等等。然后

    这里写图片描述

    这里写图片描述

然后接着调用chain.proceed()方法循环遍历,直到所有的interceptor都遍历完成为止。

8、然后看ConnectInterceptor拦截器,这个比较重要,在streamAllocation.newStream()中创建了Socket的对象,newStream()—>findHealthyConnection()–>findConnection()–>result.connect()—>connectSocket()–>rawSocket=.....new Socket(proxy)

    这里写图片描述

9、然后执行CallServelInterceptor拦截器,负责将请求交给服务器。调用finishRequest()方法将请求发送给服务器。

    这里写图片描述

然后获取数据响应

    这里写图片描述

猜你喜欢

转载自blog.csdn.net/yuezheyue123/article/details/80688244
今日推荐