okhttp异步请求流程和源码分析

本文详细解析了OkHttp中的异步请求流程,包括创建OkHttpClient对象、构建Request对象及Call对象,重点分析了Call.enqueue方法的具体实现过程,并探讨了线程池管理、异步请求队列调整以及回调方法的执行细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一次【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()方法的实现:

    接下来具体分析它:

     

     


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

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

转载于:https://www.cnblogs.com/webor2006/p/9063363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值