1、ConnectionPool
不管是okhttp协议1.1也好,还是2.0也好,它们的keep-alive机制,或者2.0的多路复用机制,他们都需要引入一个连接池的概念,来维护整个okhttp的网络连接。okhttp会将客户端和服务端抽象为一个connection类,而realConnection就是它的实现类。为了管理所有的实现类,okhttp为我们提供了connectionPool这个类,这个类就是为了管理这些所有的连接的复用设计的。当它们共享相同的地址,这时候就可以复用连接。connectionPool还实现了一些连接保持打开状态,以备后面来使用的策略。
这个类的作用就是在时间范围内复用connection,这个复用肯定有时间限制,不可能无限地复用,这在实际上也是不可能的。同时还需要对它进行有效的清理回收工作。
对connection的理解主要分为,一个是对连接的操作,还有一个是连接池中的connection是如何自动回收的。
2、get()、put()方法
在左侧的代码结构可以看出,它提供了很多认识的方法。比如get()、put()、deduplicate()、connectionBecameIdle()方法,connectionBecameIdle()方法很巧妙,就是将连接变为idle状态
3、get()方法
for循环遍历connections,从中获取一个可用的connection,然后通过connection.isEligible()根据参数address、route来进行判断这个连接是否可用,当它可用的时候,调用streamAllocation.acquire()这个方法获取所用的连接池
acquire()方法
466行就是将realConnection赋值给从streamAllowcation中的成员变量connection中
468行将streamAllocation的弱引用添加到connection中的allocations集合当中去。为什么要这样做呢?其实就是想根据allocations这个集合来判断当前streamAllocation所持有的连接的数目,然后通过这个集合判断一个网络连接的负载量是否已经超过了它的最大值,也就是okhttp所指定的最大次数。
allocation就是一个arraylist
4、put()方法
在添加之前,会做一个异步的清理任务。清理完成后,会将连接添加到connections这个队列中。
runnable cleanupRunnable清理任务调用了线程池去执行
connections是一个队列
5、