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()方法的实现:

    接下来具体分析它:

     

     


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

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

原文地址:https://www.cnblogs.com/webor2006/p/9063363.html