设为首页 加入收藏

TOP

Okhttp3源码解析(3)-Call分析(整体流程)(一)
2019-09-03 03:36:56 】 浏览:100
Tags:Okhttp3 源码 解析 -Call分析 整体 流程
### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](https://www.jianshu.com/p/bf1d01b79ce7) [Okhttp3源码解析(2)-Request分析](https://www.jianshu.com/p/5a85345c8ea7) ### newCall分析 ##### Call初始化 我们首先看一下在哪用到了Call: ``` final Call call = okHttpClient.newCall(request); ``` 想起来了吧?无论是get还是post请求 都要生成call对象,在上面我们发现call实例需要一个`okHttpClient`与`request`实例 ,我们先点进Call类去看看: ``` public interface Call extends Cloneable { //请求 Request request(); //同步 Response execute() throws IOException; //异步 void enqueue(Callback responseCallback); //取消请求 void cancel(); //是否在请求过程中 boolean isExecuted(); //是否取消 boolean isCanceled(); Call clone(); //工厂接口 interface Factory { Call newCall(Request request); } } ``` 我们发现Call是个接口, 并定义了一些方方法(方法含义在注释上)。 我们继续看`newCal()`方法 ``` @Override public Call newCall(Request request) { return RealCall.newRealCall(this, request, false /* for web socket */); } ``` 继续点击`newRealCall()`去: ``` private RealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) { this.client = client; this.originalRequest = originalRequest; this.forWebSocket = forWebSocket; this.retryAndFollowUpInterceptor = new RetryAndFollowUpInterceptor(client, forWebSocket); } static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) { // Safely publish the Call instance to the EventListener. RealCall call = new RealCall(client, originalRequest, forWebSocket); call.eventListener = client.eventListenerFactory().create(call); return call; } ``` 从代码中我们发现在`newRealCall()`中初始化了`RealCall`,`RealCall`中初始化了`retryAndFollowUpInterceptor` : - client: OkHttpClient 实例 - originalRequest : 最初的Request - forWebSocket :是否支持websocket通信 - retryAndFollowUpInterceptor 从字面意思来说, 是重试和重定向拦截器 ,至于它有什么作用我们继续往下看 ### 同步请求分析 ``` Response response = call.execute(); ``` 我们点进`execute()`中查看: ``` @Override public Response execute() throws IOException { synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } captureCallStackTrace(); eventListener.callStart(this); try { client.dispatcher().executed(this); Response result = getResponseWithInterceptorChain(); if (result == null) throw new IOException("Canceled"); return result; } catch (IOException e) { eventListener.callFailed(this, e); throw e; } finally { client.dispatcher().finished(this); } } ``` 从上面代码得知步骤: (1).通过 ` synchronized ` 保证线程同步,判断是否已经执行过 ,如果是直接抛异常 (2). `captureCallStackTrace();` 字面意思:捕获调用堆栈跟踪,我们通过源码发现里面涉及到了`retryAndFollowUpInterceptor` (3). ` eventListener` 回调` CallStart()` (4). `client.dispatcher().executed(this);` 看到了`dispatcher`是不是很熟悉?之前在分析`okhttpClient`初始化的时候遇到了,我们点击`executed()`方法进去: ``` synchronized void executed(RealCall call) { runningSyncCalls.add(call); } ``` 发现把我们传进来的`realcall`放到了`runningSyncCalls`队列中,从字面意思来说就是正在运行的同步的调用队列中,为什么说是队列呢? : ``` private final Deque runningSyncCalls = new ArrayDeque<>(); ``` > Deque即双端队列。是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,相比list增加[]运算符重载。 (5).我们回到`execute()`继续往下分析,剩下的代码我们提取出三行代码: - `equesr result = getResponseWithInterceptorChain();` 生成一个Response 实例 - `eventListener.callFailed(this, e);` :eventListener的callFailed回调 - `client.dispatcher().finished(this);` :dispatcher实例的finished方法 不难看出,**`getResponseWithInterceptorChain()`**一定
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Flutter学习笔记(22)--单个子元.. 下一篇入职小白随笔之高通项目编译流程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目