【Android okhttp源码解析 三】异步请求流程和源码分析

Android之OKHttp源码解析 基本的使用流程如下 二、使用流程源码分析 这里与同步请求的有些不同那异步请求流程中Dispatcher中做了什么?从上面的执行流程源码我们可以了解到在进行同步请求 时只是调用了Dispatcher的方法,将同步请求放置到同步双端队列中,这里并没有体现"分发"的作用,而在进行异步请求时,调用了Dispatcher的方法,这里接着看源码: 首先会将异步任务存储到等待队列中,其后会调用进行任务的分发,根据执行队列的请求数量最大阈值和请求相同host的数量进行一个条件判断,根据结果决定要不要把任务放置执行队 阅读详情
>okhttp源码解析系列文章: >第一篇:《okhttp框架简单介绍》 >https://blog.youkuaiyun.com/colinandroid/article/details/79774907 >第二篇:《同步请求流程和源码分析》 >https://blog.youkuaiyun.com/colinandroid/article/details/79774918 >第三篇:《异步请求流程和源码分析》 >https://blog.youkuaiyun.com/colinandroid/article/details/79774932 >第四篇:《任务调度核心类dispatcher解析》 >https://blog.youkuaiyun.com/colinandroid/article/details/79774936 >第五篇:《拦截器流程和源码解析》 >https://blog.youkuaiyun.com/colinandroid/article/details/79706161

就同步和异步请求的方法调用来说,两者的差别不是很大。执行同步请求调用的是execute()方法,执行异步请求调用的是enqueue()方法,而它们两者的内部实现原理还是有很大差别的。
经过对同步请求的分析,我们已经对okhttp网络请求的方法执行很熟悉了,并且前两步都是一样的,我们这里再简单介绍一下。
第一步,创建okHttpClient对象和Request对象;第二步,创建Call对象;第三步,执行enqueue()方法。
####1. 我们来看看enqueue()方法都做了什么
这里写图片描述
这里把传进来的responseCallback对象封装成AsyncCall,然后作为参数传给okhttpclient的dispatcher对象的enqueue()方法。
这个AsyncCall又是什么呢?
这里写图片描述
我们看到AsyncCall继承自NamedRunnable,而NameRunnable实现了Runnable接口,所以这里就是把responseCallback传进Runnable中。
接着,调用okhttpclient的分发器类dispatcher的enqueue()方法。
这里写图片描述
这里首先会判断runningAsyncCalls队列的长度是否小于允许的最大请求数maxRequests,以及我们主机的最大请求数是否小于我们设定的值。
如果满足这个条件,我们就把AsyncCall对象放到runningAsyncCalls队列中,然后再通过一个线程池来执行这个异步请求。
总结一下enqueue()方法执行的流程
######1. 判断当前Call是否执行过
######2. 封装AsyncCall对象
######3. 调用dispatcher的enqueue()方法
####2.executeService().execute()执行流程
这里写图片描述
可以看到executeService()方法创建了一个线程池。我们来看下线程池的参数,第一个参数代表了核心线程的数量,这里设定为0。为什么要设定为0呢?这代表这空闲一段时间后,就会把所有线程全部销毁;第二个参数代表允许最多线程个数,这里设定为无限大,那当线程个数过多时会不会引起程序崩溃呢?我们前文提到,okhttpclient允许的最大请求是64个,它限制了okhttpclient整个异步请求数最大为64个;第三个参数代表当多余线程数大于核心线程数时,空闲的线程最多可以存活60s。
那么为什么这样设定参数呢?在我们实际运行当中可能开启20个并发请求,那么线程池因此也会创建20个线程,当工作完成后线程池就会在60s后相继消除空闲的线程。
我们接着看,这一步其实就是调用线程池的execute()方法,来执行AsyncCall的run()方法。
####3. 我们来看看AsyncCall的run()方法是如何实现的
这里写图片描述
我们在AsyncCall中没有找到run()方法,所以我们去它的父类NamedRunnable中去找,我们看到它其实就是做了一层封装,最后调用的是execute()方法。我们来看看AsyncCall的execute()方法。
这里写图片描述
这里调用getResponseWithInterceptorChain()方法,通过拦截器链过滤最终得到Response对象。该方法是okhttp设计的非常精妙的一点。
Call执行完成后会从runningAsyncCalls中移除这个线程,只有这样readyAsyncCalls中的线程才能被执行。那么问题来了,我们什么时候开始去移除这个线程呢?
在finally中我们看到调用了okhttpclient的dispatcher的finish()方法。
这里写图片描述
finish()方法主要做了以下几件事:
######1. 把请求从异步请求队列中删除
######2. promiteCalls()方法执行
######3. 如果异步请求队列为空了,则回调idleCallback()方法
可以看到异步请求的finish()方法只比同步请求的finish()方法多了一步promoteCalls()方法的执行,它其实是用来调整我们的任务队列的。我们知道异步请求需要的两个队列都是现场不安全的,所以调用promoteCalls()方法需要在同步代码块中执行。

Okhttp使用和源码分析一(OkHttp2.x用法) 由Square团队发明的网络框架OkHttp,想必目前火过移动互联网半边天。从由Google发明的Volley停止了更新后,而OkHttp得到了官方的认可,并在不断优化。上篇文章我们简单分析和演示了Volley的源码,不过再怎么分装,OkHttp都会以强大的功能和网络请求的优化,怒甩Volley几条街!!!首先根据本人自己的理解和使用总结,OkHttp的优势由以下这些(实在太多了): 1.会根据连 阅读详情

相关推荐

异步调用流程图

NULL 博文链接:https://m635674608.iteye.com/blog/2198181

Okhttp的线程池和高并发

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

2301_82241819的博客 852

解决vscode无法运行npm命令的问题(cmd可行)

Powershell以及vscode中npm命令使用不了

无痕坚守本心的博客 2750

深入理解OkHttp:同步、异步请求逻辑

开篇陈述:OkHttp作为一个优秀的网络请求库,陪我们这些Android开发佬走过了许多风风雨雨的夜晚,所以今天特写一篇深入理解作文。同步请求的实现流程。异步请求的实现流程重要拦截器:CacheInterceptor 的解析。重要拦截器:ConnectInterceptor 的解析。重要拦截器:CallServerInterceptor 的解析。

m0_56146626的博客 1132

XPe开发初体验(一)XPe概述

XP Embedded是微软Windows Embedded产品线中非常重要的一环,不过比起大名鼎鼎的Windows Embedded CE,XPe显得过于低调了。在接下来的一段时间里,我希望能够用六篇的篇幅来描述一下XPe的整个开发过程。这个系列文章主要是针对有Windows编程经验,但是没有嵌入式开发经验的开发者,提供一些概念和开发过程的初步介绍。XP Embedded是一个基于Windo

aawolf = new Mobile.MVP 1万+

Delft3D从入门到实践:安装、编译与首次模拟指南

本文为Delft3D初学者提供了一份详尽的从零开始指南。内容涵盖软件获取、许可证申请、图形界面安装、核心计算内核的编译环境搭建与编译步骤,以及最终整合运行首个水动力模拟的全流程。重点解决了Windows系统下Delft3D安装与编译的常见问题,帮助用户快速上手这一开源水动力与泥沙输运模拟工具。

weixin_29303701的博客 539

SpringBoot异步请求

何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待****IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。其请求流程大致为: 而在Servlet3.0发布后,提供了一个新特性:异步处理请求。可以先释放容器

m0_67393342的博客 1878

EWM与SAP ERP的数据集成

1、EWM与 SAPERP的无缝集成-基础数据&业务交易数据 2、SAP ERP设置:连接SAP ERP和EWM必须设置应用程序连接支持-ALE(Application Link Enabling) 3、ERP - EWM仓库数据集成: SAP ERP需要设置配置信息,连接ERP和EWM之间的库存管理应用,基于工厂+库存地点对应一个仓库号来进行配置; 在ERP中需要创建一个中间虚拟仓库,代表ERP仓库;“中间虚拟”仓库创建之后,工厂+库存地点的信息...

weixin_43899798的博客 3797

实现异步请求有哪些方式

​ axios支持各种请求类型,如GET、POST、PUT等,并支持并发请求、请求取消、请求拦截、响应拦截、错误处理等功能。axios也提供了丰富的配置选项,例如请求超时时间、请求头、响应类型等。它可以同时处理浏览器中的XHR请求和Node.js中的http请求,并且具有很好的API设计。​ React、Vue等现代JavaScript框架中也经常使用axios来进行HTTP请求,如果您使用这些框架,建议使用npm安装axios并通过模块化方式引入。// 设置请求方式和请求地址。// 创建一个XHR对象。

wyzqhhhh的博客 1704

密码学小白必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学初学者提供了系统获取和阅读三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文的实战指南。详细介绍了通过IACR官方渠道、ePrint预印本等权威资源免费下载论文的方法,并分享了高效筛选、精读核心章节及构建个人知识体系的具体策略,帮助读者快速切入密码学研究前沿。

weixin_28363123的博客 403

STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可。 1、键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样这个8个引脚都是高电平,然后就进行列扫描。例如:假如按下3按钮,Y3 列扫描,把F4先拉低,然后读取F0-F3的状态,就会读出为1110,这就可 以知道是F3行拉低了,同时这时候是程序控制F4拉低的,这样就可以知道是F4列导致它转态变化了的,这样就可以定位出是F4列F3行的按键按下了;其他的列也是这样子扫描

lhh_qrsly的博客 7058

OkHttp面试之--OkHttp的整个异步请求流程

通过上一节,我们已经了解了如何使用OkHttp发送异步请求,下载网络图片信息并显示到ImageView控件上,从这一节开始我们就来开始研究一下其内部的实现流程和原理。因为整个流程相对而言还是比较复杂,因此对于流程的分析我划分成以下几个章节去介绍 流程概述 拦截器的原理 HttpEngine中sendRequest的流程分析 HttpEngine中readResponse的流程分析 这一节我们先来看一

zxm317122667的专栏 1万+

S32K144 UDSdoCAN 升级刷写实现笔记

本篇旨在描述如何开发“车规级”的软件升级程序,通过在S32K144平台上实现基于UDSdoCAN的刷写升级功能,带你一步步建立安全升级的“工程思维”,在这里既能收获经验还能获得工程源码、测试脚本,助你起飞,避坑提速!

汽车电子软件领域知识分享 811

okhttp源码解析

OkHttp是一个非常优秀的网络请求框架,已被谷歌加入到Android的源码中。目前比较流行的Retrofit也是默认使用OkHttp的。所以OkHttp的源码是一个不容错过的学习资源,学习源码之前,务必熟练使用这个框架,否则就是跟自己过不去。 use -> running source code -> reading & learning the source code. 1、初识

json_it的博客 2万+

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android OkHttp3源码分析

title: Android OkHttp3源码分析 date: 2019-06-03 21:16:50 tags: Android第三方框架 文章目录title: Android OkHttp3源码分析 date: 2019-06-03 21:16:50 tags: Android第三方框架Android OkHttp3源码分析介绍源码分析简单使用OkHttpClient的创建Request的...

hesheng1024的博客 2663

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android之网络请求11————Retrofit的源码分析

Android之网络请求11————Retrofit的进阶源码分析 一.前言 前两篇文章主要分析了Retrofit的应用,这一篇主要分析的源码。在分析源码的时候,发现了一篇很好的博客,以及一个讲解视频,这里分享给大家 Retrofit分析-漂亮的解耦套路(视频版) Android:手把手带你 深入读懂 Retrofit 2.0 源码 二.Retrofit的大致流程分析 一般网络请求的过程: R...

冰炭不投day的博客 1320

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android_OkHttp源码分析

Android_OkHttp源码分析

Luzhuo 的博客 2231

Android之网络请求5————OkHttp源码2:发送请求

Android之网络请求5————OkHttp源码:发送请求

冰炭不投day的博客 1142

OkHttp原理解析

okhttp分析

lcj908692的博客 6176

okhttp源码分析

一、okhttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。现在在Android开发中最火的应用最多的联网框架毫无疑问是okhttp,目前已经大量替代了Volley、HttpUrlC...

qq_21915769的博客 356

Android-OkHttp源码分析、拦截器

Android-OkHttp 源码分析 OkHttpGitHub OkHttp官网 现在4.0以后基于Kotlin… 我们今天来看看3.14.2版,基于java… kotlin目前博主不熟 - -! 添加依赖 implementation(“com.squareup.okhttp3:okhttp:3.14.2”) 我们先来看看基本使用 建造者模式:一般在构建对象的过程需要配置很多很多的参数时...

weixin_43506260的博客 398

okhttp3源码分析:架构全面解析

一、摘要 okhttp3在android应用开发中是现今最牛(哔)的网络交易框架,不接受反驳。 二、okhttp3源码地址 okhttp3框架源码地址:https://github.com/square/okhttp 三、okhttp3简单使用 OkHttpClient client = new OkHttpClient.Builder().build(); Requ...

android开发笔记 1636

okhttp源码深入解析

OkHttp是一个非常优秀的网络请求框架,已被谷歌加入到Android的源码中。目前比较流行的Retrofit也是默认使用OkHttp的。所以OkHttp的源码是一个不容错过的学习资源,学习源码之前,务必熟练使用这个框架,否则就是跟自己过不去。 use -> running source code -> reading & learning the source code. ...

heng615975867的专栏 2671

Android 主流开源框架(三)OkHttp 源码解析

文章首发于我的个人博客:wildma的博客,这里有更好的阅读体验,欢迎关注。 前言 最近有个想法——就是把 Android 主流开源框架进行深入分析,然后写成一系列文章,包括该框架的详细使用与源码解析。目的是通过鉴赏大神的源码来了解框架底层的原理,也就是做到不仅要知其然,还要知其所以然。 这里我说下自己阅读源码的经验,我一般都是按照平时使用某个框架或者某个系统源码的使用流程入手的,首先要知道怎...

wildma的博客 1002
上一篇: 【Android okhttp源码解析 二】同步请求流程和源码分析
下一篇: 【Android okhttp源码解析 四】任务调度核心类dispatcher解析
Colin_Mindset
博客等级 码龄12年 159粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值