2.OkHttp的初始化
OkHttp的整个的初始化采用了一个Builder的形式来建造,对设计模式不太了解的同学可以去看
https://github.com/mirsfang/ExamplesOfDesignPatterns
接下来进入正题
OkHttpClient的初始化
OkHttpClient在代码中是这样的
OkHttpClient okHttpClient=new OkHttpClient.Builder().build();
OkHttpClient 是一个Call 的工厂,可以发送http请求和读取他的相响应,通常OkHttpClient官方建议是把他共性,个人理解就是整个App或者client只有一个,不然的话每个client都拥有自己的连接池和线程池,每个client去创建连接池和线程池,这些资源都会被浪费掉的。
我们跟着上面的代码来去分析OkHttpClient
OkHttpClient通过Builder的build去构架的OkHttpClient,所以我们先看Builder类和Builder的build方法
首先是Builder的build方法:
public OkHttpClient build() {
return new OkHttpClient(this);
}
这就尴尬了,,我们来看Builder的构建方法
public Builder() {
dispatcher = new Dispatcher();//调度器 负责执行异步请求时的策略。
protocols = DEFAULT_PROTOCOLS; //协议,包含http1.1和http2
connectionSpecs = DEFAULT_CONNECTION_SPECS;//链接的规格(HTTPS的TSL规格)
eventListenerFactory = EventListener.factory(EventListener.NONE);
proxySelector = ProxySelector.getDefault();//代理服务器
cookieJar = CookieJar.NO_COOKIES;//cookie管理
socketFactory = SocketFactory.getDefault();//sokcet工厂
hostnameVerifier = OkHostnameVerifier.INSTANCE;
certificatePinner = CertificatePinner.DEFAULT;
proxyAuthenticator = Authenticator.NONE;
authenticator = Authenticator.NONE;
connectionPool = new ConnectionPool();//连接池
dns = Dns.SYSTEM; //Dns
followSslRedirects = true;
followRedirects = true;
retryOnConnectionFailure = true;
connectTimeout = 10_000;
readTimeout = 10_000;
writeTimeout = 10_000;
pingInterval = 0;
}
我们从上面可以看到 Builder 主要是构建了基础的默认参数,上面注释了一些比较重要的参数,我们再来看OkHttpClient的构造函数
OkHttpClient(Builder builder) {
this.dispatcher = builder.dispatcher;
this.proxy = builder.proxy;
this.protocols = builder.protocols;
this.connectionSpecs = builder.connectionSpecs;
this.interceptors = Util.immutableList(builder.interceptors);
this.networkInterceptors = Util.immutableList(builder.networkInterceptors);
this.eventListenerFactory = builder.eventListenerFactory;
this.proxySelector = builder.proxySelector;
this.cookieJar = builder.cookieJar;
this.cache = builder.cache;
this.internalCache = builder.internalCache;
this.socketFactory = builder.socketFactory;
boolean isTLS = false;
for (ConnectionSpec spec : connectionSpecs) {
isTLS = isTL