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

      接下来具体分析它:

       

       


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

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

  • 相关阅读:
    浅析linux 下的/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc(转)
    【引用】如何关闭SELinux
    typedef 用法(转)
    【引用】让source insight在窗口标题栏上显示文件全路径
    c语言 typedef(转)
    ip分片 tcp分段(转)
    linux 命令 pushd popd cd 区别
    linux xargs
    JS实现简单hashtable
    Page.ClientScript.RegisterClientScriptBlock 与RegisterClientScriptBlock
  • 原文地址:https://www.cnblogs.com/webor2006/p/9063363.html
Copyright © 2020-2023  润新知