Android高工:okhttp原理详解,搞懂了直接去虐面试官,理解透彻

本文详细介绍了OkHttp的连接池管理,包括连接池中的清理任务执行和线程处理。当连接池有连接时,通过cleanup()方法进行循环清理;无连接时,等待连接加入再启动清理。OkHttp的Dispatcher调度器控制了请求并发数量,通过ExecutorService线程池辅助任务复用。文中还探讨了OkHttp中的设计模式和优势,如责任链模式、单例模式等,以及其在网络优化和扩展性方面的特点。
摘要由CSDN通过智能技术生成

当连接池中有连接时:清理任务由cleanup()方法完成,首先执行清理,并返回下次需要清理的间隔时间,调用调用wait() 方法释放锁。等时间到了以后,再次进行清理,并返回下一次需要清理的时间间隔,再次进入wait,以此循环往复。

当连接池中没有连接时:cleanup()返回-1,跳出循环,下次有连接加进来时,再次开启线程进行循环清理。

之所以连接池线程可以跳出循环,是因为,他是子线程,而looper选择一直阻塞是因为他是主线程,如果跳出,程序执行结束。

连接池原理2

  1. 首先统计空闲连接数量;

  2. 然后通过for循环查找最长空闲时间的连接以及对应空闲时长;

  3. 然后判断这个最长空闲时间的连接是否超出最大空闲连接数或者或者超过最大空闲时间,满足其一则清除最长空闲的连接。如果不满足清理条件,则返回一个对应等待时间。

这个对应等待的时间又分二种情况:

  1. 有空闲连接:则返回:keepAliveDurationNs-longestIdleDurationNs;

  2. 没有空闲的连接,则返回:keepAliveDurationNs

注意:清除一个空闲连接后,会返回0,再次立即开始清理。

如何统计空闲连接呢?

统计空闲连接

StreamAllocation创建或者复用一个Connection后,会将自己添加到Connection的connection.allocations列表中,数据读取完毕之后,会将自己从Connection的connection.allocations中移除,所以判读一个Connection是否是空闲连接可以采用引用计数法,判断connection.allocations列表中是否有StreamAllocation,如果没有就是空闲连接,否则不是。

三、OkHttp中Dis

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值