zoukankan      html  css  js  c++  java
  • 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()方法的实现:

      接下来具体分析它:

       

       


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

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

  • 相关阅读:
    图像处理-06-图像的反色处理
    Egg.js框架
    Node基础
    Node介绍与安装
    线性表结构-数组(散列表与可变长度数组)
    复杂度分析和大O表示法
    Java框架之Struts2(六)
    Java框架之Struts2(五)
    Java框架之Struts2(四)
    Java框架之Struts2(三)
  • 原文地址:https://www.cnblogs.com/webor2006/p/9063363.html
Copyright © 2011-2022 走看看