美文网首页
Okhttp的流程(快速过一遍)

Okhttp的流程(快速过一遍)

作者: 雨来 | 来源:发表于2022-09-22 16:21 被阅读0次

可以先读下这篇博客
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.png
Dispatcher.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

相关文章

网友评论

      本文标题:Okhttp的流程(快速过一遍)

      本文链接:https://www.haomeiwen.com/subject/mxiwortx.html