架构师学习--okhttp3连接池实现

首先我们需要明白,okhttp比其他网络请求框架的优势在哪里?当然最重要的就是他对传输层的Socket进行了进一步的封装。所谓的封装,就是拿到服务器最原始的数据流,进行解析,返回给用户。大家需要明白一点,socket的连接是需要消耗资源的,如果每一次网络请求都去创建一个socket,显然是不合理的。所以okhttp就引出了连接池的概念。所谓的连接池就是为了复用socket,比如我们请求一个地址,如果下一次在规定时间内,发送同样的请求,那么socket就会被复用。

一、创建连接对象

所谓的连接对象,可以说是封装了Socket。并且记录最后使用它的时刻。
在这里插入图片描述
构造方法中创建socket对象,并且记录当前时间:
在这里插入图片描述
提供方法,判断是否可以复用该连接对象:
在这里插入图片描述

二、创建连接池

首先定义如下字段
在这里插入图片描述
keepLive:超过这个时间,将会回收连接对象
queueList:存放连接对象
isRunning:防止回收线程重复启动
idleTime:当前连接对象的闲置时间

1、添加连接对象

在这里插入图片描述
在这里就开启了清理线程,清理线程就是一个缓存线程池

2、清理线程

在这里插入图片描述
这里开启一个while循环,内部使用waitTime判断何时需要跳出死循环,即队列中没有连接对象就可以跳出死循环。这里会调用clean()方法。做真正的清理工作

3、clean

在这里插入图片描述
这里会判断当前连接对象的闲置时间是否已经超过了最大等待时间,然后从队列中移除这些对象。并且计算出所有连接对象的最大闲置时间,计算出下一次进行clean的时间。

4、获取连接对象

在这里插入图片描述
供外部调用,如果需要复用该连接对象,直接从队列中取出来。

三、创建连接池使用管理类

在这里插入图片描述
使用连接池,首先判断当前对象是否存在于连接池中,没有的话需要添加到连接池,并且记录当前对象的添加时间。

四、测试

测试代码如下:
在这里插入图片描述
测试结果如下:
在这里插入图片描述
结果显示没有在连接池中的会创建新的连接对象,存在的会复用连接对象。

ok,这样一个连接池就被我们完成了。附上完整代码

完整代码:

代码传送门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值