1.深入浅出 OkHttp 源码解析及应用实践
2.OkHttp3源码详解之 okhttp连接池复用机制(一)
3.工欲善其事必先利其器之OkHttp解读
深入浅出 OkHttp 源码解析及应用实践
深入浅出 OkHttp 源码解析及应用实践,解析解析是源码源码 vivo 互联网服务器团队成员 Tie Qinrui 的一篇技术文章。文章旨在剖析 OkHttp 的解析解析源代码,揭示其设计原理与应用实践,源码源码以提升开发者对 Java 和 Android 世界中广泛使用的解析解析 OkHttp 框架的理解与使用能力。
首先,源码源码采购流程源码文章从 OkHttp 请求发起过程的解析解析核心代码着手,通过具体示例演示了同步或异步请求的源码源码执行流程。作者详细阐述了 OkHttp 的解析解析整体结构,借助流程图与架构图,源码源码概述了 OkHttp 的解析解析设计模式与分层架构。重点在于解析拦截器的源码源码责任链模式设计,以及如何在实际项目中应用拦截器以解决统一修改请求与响应内容的解析解析问题。
接着,源码源码文章深入探讨了 OkHttp 的解析解析核心执行流程,包括同步请求的执行过程、整个请求生命周期的源码做程序缺管理,以及不同层次的处理过程。通过分析核心功能通过拦截器实现的方式,文章揭示了 OkHttp 拦截器的种类与作用,包括应用程序拦截器与网络拦截器,并对比了它们的优缺点。
责任链模式的巧妙运用是 OkHttp 的一大亮点,文章详细解释了责任链模式的原理及其在 OkHttp 中的实现方式。通过分析责任链的串联机制,文章揭示了 OkHttp 拦截器如何在请求处理过程中形成有序的执行链,使得请求可以依次通过各个拦截器处理。
最后,文章以实际项目中的一个具体应用为例,展示了如何利用 OkHttp 拦截器在请求头中添加认证信息,说明了通过拦截器实现统一修改请求或响应内容的便利性。这一部分直接提供了将理论知识应用于实践的示例,增强了文章的首营平台源码实用性和可操作性。
综上所述,深入浅出 OkHttp 源码解析及应用实践,不仅揭示了 OkHttp 的设计细节和实现原理,还通过实际案例展示了如何将理论知识应用于实际项目中。文章强调了学习优秀开源软件设计与编码经验的重要性,以及如何更好地使用 OkHttp 的特性,并对特殊场景下的问题排查提供指导。
OkHttp3源码详解之 okhttp连接池复用机制(一)
提高网络性能优化,关键在于降低延迟和提升响应速度。
在浏览器中发起请求时,header部分通常如下所示:
keep-alive是指浏览器与服务端之间保持长连接,这种连接可以复用。在HTTP1.1中,它默认是开启的。
连接复用为何能提高性能?通常,在发起http请求时,源码 北向资金我们需要完成TCP的三次握手、传输数据,最后释放连接。三次握手的过程可以参考这里:TCP三次握手详解及释放连接过程。
一次响应的过程:
在高并发的请求连接情况下或同一客户端多次频繁的请求操作中,无限制地创建连接会导致性能低下。
如果使用keep-alive,在timeout空闲时间内,连接不会关闭,相同的重复请求将复用原有的connection,减少握手的次数,大幅提高效率。
并非keep-alive的timeout设置时间越长,性能就越好。长时间不关闭会导致过多的僵尸连接和泄露连接出现。
那么,短网址网址源码OkHttp3在客户端是如何实现类似keep-alive的机制的?
连接池的类位于okhttp3.ConnectionPool。我们的目标是了解如何在timeout时间内复用connection,并有效地对其进行回收清理操作。
其成员变量代码片段:
excutor:线程池,用于检测闲置socket并进行清理。
connections:connection缓存池。Deque是一个双端列表,支持在头尾插入元素,这里用作LIFO(后进先出)堆栈,多用于缓存数据。
routeDatabase:用于记录连接失败的router。
2.1 缓存操作:
ConnectionPool提供对Deque进行操作的方法,包括put、get、connectionBecameIdle、evictAll等操作,分别对应放入连接、获取连接、移除连接、移除所有连接操作。
2.2 连接池的清理和回收:
在观察ConnectionPool的成员变量时,我们了解到一个Executor线程池用于清理闲置的连接。注释中这样解释:
Background threads are used to cleanup expired connections
我们在put新连接到队列时,会先执行清理闲置连接的线程。调用的正是executor.execute(cleanupRunnable);方法。观察cleanupRunnable:
线程中不停调用Cleanup清理的动作并立即返回下次清理的间隔时间。继而进入wait等待之后释放锁,继续执行下一次的清理。所以可能理解成它是个监测时间并释放连接的后台线程。
了解cleanup动作的过程。这里就是如何清理所谓闲置连接的流程。怎么找到闲置的连接是主要解决的问题。
在遍历缓存列表的过程中,使用连接数目inUseConnectionCount和闲置连接数目idleConnectionCount的计数累加值都是通过pruneAndGetAllocationCount()是否大于0来控制的。那么很显然,pruneAndGetAllocationCount()方法就是用来识别对应连接是否闲置的。>0则不闲置,否则就是闲置的连接。
进入观察:
好了,原先存放在RealConnection中的allocations派上用场了。遍历StreamAllocation弱引用链表,移除为空的引用,遍历结束后返回链表中弱引用的数量。所以可以看出List>就是一个记录connection活跃情况的List。>0表示活跃,=0表示空闲。StreamAllocation在列表中的数量就是物理socket被引用的次数。
解释:StreamAllocation被高层反复执行aquire与release。这两个函数在执行过程中其实是在一直在改变Connection中的List大小。
搞定了查找闲置的connection操作,我们回到cleanup的操作。计算了inUseConnectionCount和idleConnectionCount之后,程序又根据闲置时间对connection进行了一个选择排序,选择排序的核心是:
通过对比最大闲置时间选择排序可以方便地查找出闲置时间最长的一个connection。如此一来,我们就可以移除这个没用的connection了!
总结:清理闲置连接的核心主要是引用计数器List>和选择排序算法以及excutor的清理线程池。
工欲善其事必先利其器之OkHttp解读
OkHttp的基本使用流程主要包括同步请求和异步请求。同步请求通过execute方法完成,异步请求通过enqueue方法执行。在同步请求过程中,请求被放置在同步双端队列中,而异步请求则首先存储在readyAsyncCalls等待队列中,之后通过promoteAndExecute方法进行任务分发,根据执行队列的请求数量和请求的相同host数量进行判断,将任务放置在runningAsyncCalls执行队列中,或者直接调用线程池进行执行。OkHttp的分发器Dispatcher的主要职责在于管理任务队列的分发和线程池的创建。
OkHttp的拦截器负责处理请求和响应的流程。责任链通过getResponseWithInterceptorChain方法调用,每个责任链对象对应一个拦截器,如重试拦截器、桥接拦截器、缓存拦截器、连接拦截器和请求服务拦截器。桥接拦截器用于封装请求和响应,缓存拦截器在特定场景下直接中断拦截器调用并返回结果。连接拦截器管理连接池,控制连接的获取和释放,涉及最大闲置连接数量和连接存活时间的设定。请求服务拦截器是拦截器集合的最后环节,负责网络请求和最终返回response。
OkHttp的解析至此完成,文中还提供了OkHttp源码解析笔记,包含了从基础原理到深入源码的解析过程。如果对笔记感兴趣,可点击查看获取方式或下方小卡片传送门直达。笔记中还包括了更多Android知识点记录。