OKHttp源码解析 2:同步请求与异步请求流程和源码分析

前言

前面一章已经对OKHttp的同步和异步请求的基本用法进行了讲解,总的来说,都是分为四个步骤。前面三步都是一样的,只有第四步有调用方法的区分,同步调用的是 Call 的 execute() 方法,异步调用的是 Call 的 enqueue() 方法。现在我们就根据这四步的调用流程,一步一步深入到源码,看一下 OKHttp 都做了一些什么。

首先说明:笔者现在用的 OKHttp 版本为 com.squareup.okhttp3:okhttp:3.10.0,跟踪源码的过程中,我会尽量把每一个步骤的源码都贴出来,方便大家可以一边看文章一边读源码,当然也建议大家能够打开Android Studio,跟着我一起跟踪源码,因为这样你会对源码有更全面深入的了解。好了,话不多说,直接进入正题。

OKHttpClient创建时,主要都做了什么?

首先,我们从 OKHttpClient 的创建入手,

//创建OkHttpClient,这里只简单设置了超时时间为10秒
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS).build();

这里可以看到,OKHttpClient 是通过 Builder 模式创建的,现在我们进入到 Builder() 方法,源码如下:

public Builder() {
    //OKHttp核心:分发器类
    dispatcher = new Dispatcher();
    protocols = DEFAULT_PROTOCOLS;
    connectionSpecs = DEFAULT_CONNECTION_SPECS;
    eventListenerFactory = EventListener.factory(EventListener.NONE);
    proxySelector = ProxySelector.getDefault();
    cookieJar = CookieJar.NO_COOKIES;
    socketFactory = SocketFactory.getDefault();
    hostnameVerifier = OkHostnameVerifier.INSTANCE;
    certificatePinner = CertificatePinner.DEFAULT;
    proxyAuthenticator = Authenticator.NONE;
    authenticator = Authenticator.NONE;
    //连接池
    connectionPool = new ConnectionPool();
    dns = Dns.SYSTEM;
    followSslRedirects = true;
    followRedirects = true;
    retryOnConnectionFailure = true;
    connectTimeout = 10_000;
    readTimeout = 10_000;
    writeTimeout = 10_000;
    pingInterval = 0;
}

Builder构造方法中,最重要的两个类是 Dispatcher 和 ConnectionPool,源码中我已经分别加了注释。

其中 Dispatcher 是 OKHttp 的核心类:分发器类,由它决定异步请求是直接加入到请求队列中,还是加入到等待队列中。当然,同步请求也是由它控制,只是没有异步请求这么复杂。在后面的章节中,我会重点分析这个类,这里只做简要的功能说明。

另外一个就是 ConnectionPool,它是 OKHttp 的连接池,也是 OKHttp 中一个很重要的概念。它主要起到复用http连接、管理http连接的作用,后面章节也会对它进行重点讲解。

除了这两个重要的参数,Builder 构造方法中还有各种其他的参数,它们都是在这个构造方法中进行初始化,然后传递 Builder 对象到 OKHttpClient 的构造方法中,完成 OKHttpClient 的各种参数的初始化。

//通过Builder()构造方法对各参数进行初始化之后,调用build()方法,传递Builder对象
//(this关键字代表的就是Builder对象)到OKHttpClient中,完成OKHttpClient对象的创建
public OkHttpClient build() {
    return new OkHttpClient(this);
}

这就是Builder构建模式,当有很多参数需要初始化时,我们可以使用这种模式来创建对象,很多大型开源框架中都有用到,在我们日常的业务开发中,也可以使用到这种模式。到这里OKHttpClient就创建完成了,接下来我们分析Request的创建。

Request的创建

//创建Request
Request request = new Request.Builder()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值