可以先读下这篇博客
https://blog.csdn.net/nahfang/article/details/124102637
入口从哪里开始?
首先通过 Request.Builder构建一个Request 把 request 传给okhttpclient的 newCall 这样一个网络请求就可以发起了
Request request = new Request.Builder().url("").get().build();
OkHttpClient client = new OkHttpClient.Builder().build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
image.png
RealCall 的 enqueue方法
image.pngDispatcher.enqueue
注意 AsyncCall 是一个 Runnable
image.png
Dispatcher的promoteExecute方法
image.png image.png注意这里executorService.execute(this); 它会执行 下面这个方法 ,因为AsyncCall 继承 NamedRunnable
而 NamedRunnable 是一个Runnable 在其run方法里又执行了 execute (同步请求) 方法 (这里要注意 因为面试可能会考到 okhttp的异步请求其实最终调用的是 不是同步方法 execute方法) 所以会执行下面 execute同步方法 在这里我们看到了
Response response = getResponseWithInterceptorChain(); //就是从它这里拿到数据的
image.png
进入 RealCall的 getResponseWithInterceptorChain()方法
image.png我们看这一行
Response response = chain.proceed(originalRequest);
chain的实现类 是 RealInterceptorChain
image.png
也就是 上面getResponseWithChain 中添加的拦截器 其实再向里面走我自己也有点头晕了
后面的不再追了 有时间了可以研究研究 Transmitter 和 Exchange 、 RealConnection 这三个类 实际就是通过socket 进行通信的。
纠错:
这个是 okhttp的同步请求方法
image.png
所以上面说 异步请求最终调的是同步请求方法是错误的
image.png
网友评论