okhttp异步请求流程和源码分析
在上一次【http://www.cnblogs.com/webor2006/p/8023967.html】中对同步请求进行了详细分析,这次来分析一下异步请求,而关于异步请求和同步请求其使用方式基本上差不多,下面来回顾一下:

其异步请求的步骤如下:
1、创建一个OkHttpClient对象。【跟同步请求一样】
2、构建一个Request对象,通过OkHttpClient和Request对象,构建出Call对象。【跟同步请求一样】
3、执行Call的enqueue方法。
- 判断当前Call。
这里主要是分析一下这个enqueue的具体实现:

也就是相同的请求只能够执行一次,不能重复去执行,继续:

- 封装成一个AsyncCall对象。
在调用enqueue()方法之前,会封装一个AsyncCall对象,那AsyncCall又是个什么东东:


- client.dispatcher().enqueue()。
接着到了异步请求最核心的方法了,开始探究:
接着一行行分析,首先做了一个判断:

其中用到了几个变量,先对其进行了解一下:




其中这很明显就是保证该线程池对象是一个单例,另外对于第二个参数maximumPoolSize目前传的是Integer.MAX_VALUE,那如果有万千上万个并发异步请求来了,那不是得开成千上万个线程?其实不是的啦,在前面也分析过有一个最大请求上限的判断,最大并发异步请求数不会超过64个,再来回顾一下:

那AsyncCall线程具体是如何执行异步请求的呢?

所以进父类进行查看:

所以回到AsyncCall的execute()方法的实现:

接下来具体分析它:










那它是干嘛用的呢?它其实是用来调整整个异步请求的队列用的,因为用的这个队列是非线程安全的,所以咱们可以看到这句话是被同步代码包裹着的:



至此整个异步的请求流程分析分毕,需要特别注意的是回调方法都是在子线程中运行的,如下:

okhttp异步请求流程和源码分析的更多相关文章
- okhttp同步请求流程和源码分析
在上一次[http://www.cnblogs.com/webor2006/p/8022808.html]中已经对okhttp的同步与异步请求的基本使用有了一了初步了解,这次来从源码的角度来分析一下同 ...
- Flask系列10-- Flask请求上下文源码分析
总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...
- Android Debuggerd 简要介绍和源码分析(转载)
转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...
- Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析
Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...
- Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...
- Kubernetes Job Controller 原理和源码分析(二)
概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
- Kubernetes Job Controller 原理和源码分析(一)
概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...
随机推荐
- ffmpeg 编译集成libfdk-aac
目录 1. 编译libfdk-aac 2. 编译ffmpeg 1. 编译libfdk-aac 下载源码:$ git clone https://github.com/mstorsjo/fdk-aac. ...
- Ubuntu下Iptables的简单运用,开放/关闭端口,禁止/允许IP或IP段访问...
首先添加规则有两个参数:-A和-I,其中-A是添加到规则的末尾:-I可以插入到指定位置,没有指定位置的话默认插入到规则的首部,由于匹配规则是从上往下,依次查找的,可能出现配置的规则冲突导致后续的规则不 ...
- spring使用FactoryBean给ioc容器加入组件
FactoryBean是srping的一个接口,现在我们来创建一个类MyFactoryBean 来实现FactoryBean接口 package org.springframework.beans.f ...
- golang 二维切片
初始化: res := make([][length]int, length), 例如: res := make([][2]int, 10) fmt.Println(res) 输出: [[0 0] [ ...
- ubuntu配置vnc服务
今晚比较闲,就用ubuntu系统搭了vnc系统,真的好用(比centos简单多了). 简单介绍下,VNC(Virtual Network Computing)服务是一款优秀的屏幕分享及远程连接服务,基 ...
- 【转帖】龙芯将两款 CPU 核开源,这意味着什么?
龙芯将两款 CPU 核开源,这意味着什么? https://www.oschina.net/news/78316/loongson-open-source-two-cpu-core 文章挺不错的 也讲 ...
- [转帖]localectl
localectl http://linux.51yip.com/search/localectl localectl 命令简介. 相关命令:暂无相关命令 localectl — 控制系统的本地化与键 ...
- Ember.js和Vue.js,哪种框架更适合你?
JavaScript最初是为Web应用程序而创建的.随着前端技术的发展,比起纯JavaScript 脚本,大多数开发人员更喜欢使用基于JavaScript的框架来开发Web应用,如Vue.React等 ...
- 第7章:LeetCode--算法:递归问题
70. Climbing Stairs This problem is a Fibonacci problem.F(n)=F(n-1)+F(n-2);Solving this problem by r ...
- 【Python基础】06_Python中的函数
1.函数的定义 def 函数名(): 函数封装的代码 …… 注:函数前后应该保留两个空行 2.函数的使用 直接使用函数名()调用函数块. def say_hello(): print("He ...