IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Android高工:okhttp原理详解,大厂架构师经验分享 -> 正文阅读

[网络协议]Android高工:okhttp原理详解,大厂架构师经验分享

主要的工作就是把请求的Request写入到服务端,然后从服务端读取Response。

  1. 写入请求头

  2. 写入请求体

  3. 读取响应头

  4. 读取响应体

二、连接池原理

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

由于HTTP是基于TCP,TCP连接时需要经过三次握手,为了加快网络访问速度,我们可以Reuqst的header中将Connection设置为keepalive来复用连接。

Okhttp支持5个并发KeepAlive,默认链路生命为5分钟(链路空闲后,保持存活的时间),连接池有ConectionPool实现,对连接进行回收和管理。

2.1、连接池的清理

连接池清理1

ConectionPool在内部使用一个异步线程来清理连接。

当连接池中有连接时:清理任务由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中Dispatcher和线程池

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

3.1、OkHttp中线程池


public synchronized ExecutorService executorService() {

    if (executorService == null) {

      executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,

          new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));

    }

    return executorService;

  } 

OkHttp中的线程池是一个 newCachedThreadPool。

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

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

3.2、OkHttp中Dispatcher

RealCall.execute

  • RealCall.execute

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

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

RealCall.enqueue

  • RealCall.enqueue

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

  • 注意:

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

轮询readyAsyncCalls

  • 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路漫漫,共勉!

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

总结

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

Android大厂面试真题全套解析

2017-2020字节跳动Android面试真题解析PDF
19e7abc4d8b.png)

总结

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

[外链图片转存中…(img-scn4Sv8m-1630568489411)]

[外链图片转存中…(img-PuzpQQPx-1630568489413)]
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:18:17  更:2021-09-03 12:20:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/27 2:01:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码