1、默认的线程池
在第一篇文章中有提过,okhttp 的异步请求是基于其内部的默认的线程池实现的。
而默认的线程池是在 Dispatcher
被实例化的。
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
该线程池的核心线程数为 0,线程池最有能容纳 Integer.MAX_VALUE
个线程,且线程的空闲存活时间为 60s(可以理解为 okhttp 随时可以创建新的线程来满足需要。可以保证网络的 I/O 任务有线程来处理,不被阻塞)。
重点是使用的阻塞队列为 SynchronousQueue
,参考:
https://luoming1224.github.io/2018/03/19/[java1.8%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0]SynchronousQueue%E8%AF%A6%E8%A7%A3/
2、addNetworkInterceptor() 与 addInterceptor() 的区别
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
// 收集拦截器的临时列表
List<Interceptor> interceptors = new ArrayList<>();
// 先添加通过 OkHttpClient.Builder # addInterceptor() 方法添加的拦截器
interceptors.addAll(client.interceptors());
interceptors.add(retryAndFollowUpInterceptor);
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
// 如果不是 WebSocket 请求,
// 则添加通过 OkHttpClient.Builder # addNetworkInterceptor() 方法添加的拦截器
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
originalRequest, this, eventListener, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
return chain.proceed(originalRequest);
}
上面是构造拦截器链的过程,可以看到,通过 addInterceptor()
方法添加的拦截器是放在最前面的。
而通过 addNetworkInterceptor()
方法添加的网络拦截器,则是在非 WebSocket 请求时,添加在 ConnectInterceptor 和 CallServerInterceptor 之间的。
addInterceptor(应用拦截器):
1,不需要担心中间过程的响应,如重定向和重试.
2,总是只调用一次,即使HTTP响应是从缓存中获取.
3,观察应用程序的初衷. 不关心OkHttp注入的头信息如: If-None-Match.
4,允许短路而不调用 Chain.proceed(),即中止调用.
5,允许重试,使 Chain.proceed()调用多次.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
addNetworkInterceptor(网络拦截器):
1,能够操作中间过程的响应,如重定向和重试.
2,当网络短路而返回缓存响应时不被调用.
3,只观察在网络上传输的数据.
4,携带请求来访问连接.
参考:Okhttp 的addInterceptor 和 addNetworkInterceptor 的区别?
3、复用连接池
参考:Android网络编程(八)源码解析OkHttp后篇[复用连接池]
即用于复用连接的连接池。