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

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

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

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

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

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

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

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

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

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

如何统计空闲连接呢?

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

[](()三、OkHttp中Dispatcher和线程池

========================================= 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 ==========================================

3.1、OkHttp中线程池

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;

}

OkHttp中的线程池是一个 newCachedThreadPool。

所以在 OkHttp 中线程池只是一个辅助作用,仅仅是用来做线程缓存,便于复用的。

真正控制请求并发数量和执行时机是通过调度器 Dispatcher 完成的。

3.2、OkHttp中Dispatcher

  • RealCall.execute

先将RealCall加入Dispatcher的runningSyncCalls队列,然后调用

getResponseWithInterceptorChain获取Response,最后调用Dispatcher的finished方法,将自身从runningSyncCalls移除,然后进行轮询readyAsyncCalls队列,取出ready的异步任务在满足条件的情况下进行执行。

  • RealCall.enqueue

如果当前正在执行的RealCall的数量小于最大并发数maxRequest(64),并且该call对应的Host上的call小于同一host上的最大并发数maxRequestsPerHos(5),则将该call加入runningAsyncCalls,并将这个call放到线程池中进行执行,否则加入readyAsyncCall排队等待。

  • 注意:

同步请求和异步请求执行完成之后,都会调用dispatcher的finished方法,将自身从对应的队列中移除,然后进行轮询readyAsyncCalls队列,取出ready的异步任务在满足条件下放到线程池中执行。

  • Dispatcher.中的并发数量及三个队列的作用

maxRequests = 64 // 最大并发请求数为64

maxRequestsPerHost = 5 //每个主机最大请求数为5

ExecutorService executorService //消费者池(也就是线程池)

Deque readyAsyncCalls:// 异步的缓存,正在准备被消费的(用数组实现,可自动扩容,无大小限制)

Deque runningAsyncCalls //正在运行的 异步的任务集合,仅仅是用来引用正在运行的任务以判断并发量,注意它并不是消费者缓存

Deque runningSyncCalls //正在运行的,同步的任务集合。仅仅是用来引用正在运行的同步任务以判断并发量

[](()四、OkHttp中的设计模式

==========================================================================

责任链模式:拦截器链

单例模式:线程池

观察者模式:各种回调监听

策略模式:缓存策略

Builder模式:OkHttpClient的构建过程

外观模式:OkHttpClient封装了很多类对象

工厂模式:Socket的生产

[](()五、OkHttp的优势

=======================================================================

5.1、功能方面:

功能全面,满足了网络请求的大部分需求。

5.2、网络优化方面:

  1. 内置连接池,支持连接复用

  2. 支持gzip压缩响应体

  3. 通过缓存避免重复的请求

  4. 支持http2,对一台机器的所有请求共享同一个socket

5.3、扩展性方面:

拦截器模式使得我们很容易使得我们很容易添加一个自定义拦截器对请求和返回结果进行处理。

[](()最后

==============================================================

在这里就再分享一份由大佬亲自收录整理的Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料

这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。

当然,你也可以拿去查漏补缺,提升自身的竞争力。

真心希望可以帮助到大家,Android路漫漫,共勉!

如果你有需要的话,只需 [点击这里快速免费获取](()


Android高工:okhttp原理详解,搞懂了直接去虐面试官相关推荐

  1. Android中okhttp原理详解

    目录 1.okhttp工作的大致流程 2.okhttp中的连接 3.Dispatcher和线程池 4.OkHttp中的设计模式 5.OkHttp的优势 6.参考连接 1.okhttp工作的大致流程 1 ...

  2. android中okhttp原理详解,Android中okhttp原理详解-极度针对面试篇

    一.okhttp工做的大体流程 1.一.总体流程 (1).当咱们经过OkhttpClient创立一个Call,并发起同步或者异步请求时: (2).okhttp会经过Dispatcher对咱们全部的Re ...

  3. Android涂鸦画板原理详解——从初级到高级(二)

    前言 前面写了<Android涂鸦画板原理详解--从初级到高级(一)>,讲了涂鸦原理初级和中级的应用,现在讲解高级应用.如果没有看过前面一篇文章的同学,建议先去看看哈. 准备 高级涂鸦涉及 ...

  4. Android 中malloc_debug 原理详解

    版本基于:Android R 关联博文: Android 中malloc_debug 使用详解 0. 前言 最近上项目中遇到一个native 可能内存泄漏的问题,曾考虑使用HWASAN,但这个工具是针 ...

  5. Android分包MultiDex原理详解

    MultiDex的产生背景 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的 ...

  6. Android核心破解原理详解

    玩 Android 时,我们经常会听到核心破解这个词,在部分第三方 ROM 里,也有一些作者会直接完成核心破解,以使 Android 拥有更大的可玩性.那么倒底什么是核心破解,它又对系统产生什么样的影 ...

  7. Android视频直播原理详解

    最近一段时间,视频直播可谓大火.在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等.本文要讲解的是如何使用一系列免费工具,打造一套视频直播方案. 视频直 ...

  8. Android线程池原理详解

    简介 但凡有点开发经验的同学都知道,频繁的创建和销毁线程是会给系统带来比较大的性能开销的.所以线程池就营运而生了.那么使用线程池有什么好处呢? 降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁 ...

  9. okhttp原理详解

    一.okhttp工作的大致流程 1.1.整体流程 当我们通过OkhttpClient创建一个Call,并发起同步或异步请求时: okhttp会通过Dispatcher对我们所有的RealCall(Ca ...

最新文章

  1. 终于找到了一篇文章!通俗地讲解面向对象的工作原理
  2. Spark详解(七):SparkContext源码分析以及整体作业提交流程
  3. CodeBlocks 更改 gui 程序为 命令行
  4. 前端基础之CSS属性
  5. java里面怎么添加表约束_alter table添加表约束
  6. 自动化测试--实现一套完全解耦的简单测试框架(二)
  7. H3C 模拟器 pc与sw直连 登录web
  8. HDU 5937 2016CCPC杭州 E: Equation(DFS)
  9. DHT,种子转磁力算法 种子info_hash 代码亲测
  10. 首页-文章列表 (三) -列表文章布局-Cell 单元格组件-一张图和三张图 van-ellipsis 内容超过一行会省略 w33-宽度33%剩余1%做了图片之间间隙.md
  11. matebook13、14 C盘扩展
  12. Quartile收购Sidecar,打造首屈一指的跨渠道电商广告平台
  13. 【文件上传漏洞11】中间件文件解析漏洞基础知识及实验——Nginx
  14. 24点游戏(自动生成随机数)
  15. NT151应用案例:西门子PLC S7-1200与派克ACR9000的通信(Part 2)
  16. 完全重映射和部分重映射分析(超详细)
  17. 抛物线交点式公式_抛物线所有公式
  18. OJ 大象喝水及苹果和虫子
  19. 手把手教你设计:拼团活动
  20. MTK 平台sensor arch 介绍-scp

热门文章

  1. 自己动手搞一个tip 插件
  2. 全套国潮笔刷,插画绘画,美的方可万物
  3. #考试酷解析# 简介
  4. ROC、Precision、Recall和Accuracy
  5. 马云的创业故事及他人生中的摆渡人-辞去“铁饭碗”创办中国黄页(四)
  6. 计算机属性隐藏之后怎么找回来,电脑隐藏文件如何设置?隐藏之后如何快速找到?老铁们都应该会的...
  7. 【POJ】1456 supermarket
  8. 常用oid节点_Oid配置、解析方法、ors客户端、oid节点及其数据库的制作方法
  9. PLC中X和Y代表什么
  10. 初识Express之express基本操作