首先我们需要明白,okhttp比其他网络请求框架的优势在哪里?当然最重要的就是他对传输层的Socket进行了进一步的封装。所谓的封装,就是拿到服务器最原始的数据流,进行解析,返回给用户。大家需要明白一点,socket的连接是需要消耗资源的,如果每一次网络请求都去创建一个socket,显然是不合理的。所以okhttp就引出了连接池的概念。所谓的连接池就是为了复用socket,比如我们请求一个地址,如果下一次在规定时间内,发送同样的请求,那么socket就会被复用。
一、创建连接对象
所谓的连接对象,可以说是封装了Socket。并且记录最后使用它的时刻。
构造方法中创建socket对象,并且记录当前时间:
提供方法,判断是否可以复用该连接对象:
二、创建连接池
首先定义如下字段
keepLive:超过这个时间,将会回收连接对象
queueList:存放连接对象
isRunning:防止回收线程重复启动
idleTime:当前连接对象的闲置时间
1、添加连接对象
在这里就开启了清理线程,清理线程就是一个缓存线程池
2、清理线程
这里开启一个while循环,内部使用waitTime判断何时需要跳出死循环,即队列中没有连接对象就可以跳出死循环。这里会调用clean()方法。做真正的清理工作
3、clean
这里会判断当前连接对象的闲置时间是否已经超过了最大等待时间,然后从队列中移除这些对象。并且计算出所有连接对象的最大闲置时间,计算出下一次进行clean的时间。
4、获取连接对象
供外部调用,如果需要复用该连接对象,直接从队列中取出来。
三、创建连接池使用管理类
使用连接池,首先判断当前对象是否存在于连接池中,没有的话需要添加到连接池,并且记录当前对象的添加时间。
四、测试
测试代码如下:
测试结果如下:
结果显示没有在连接池中的会创建新的连接对象,存在的会复用连接对象。
ok,这样一个连接池就被我们完成了。附上完整代码