Android Okhttp3 分发器源码解析

这篇具有很好参考价值的文章主要介绍了Android Okhttp3 分发器源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 OkHttp 中,分发器(Dispatcher)是负责调度和执行网络请求的组件。它管理并发请求数量以及请求的优先级,确保合理地使用底层的连接池和线程池,从而提高网络请求的效率性能

默认情况下,OkHttp 使用一个单例的分发器,它可以处理同时进行的最大请求数为 64。也可以通过自定义分发器来修改这些默认设置,以满足特定的需求。


以异步请求为例:

package okhttp3;

final class RealCall implements Call {
  // ...

  @Override public void enqueue(Callback responseCallback) {
    // ...

    client.dispatcher().enqueue(new AsyncCall(responseCallback));
  }
  // ...
}

执行了 Call.enqueue() 之后,调用到 Dispatcher.enqueue():


package okhttp3;

public final class Dispatcher {
  private int maxRequests = 64;       // 最大请求数量
  private int maxRequestsPerHost = 5; // 同 Host 下最大请求数量

  private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();   // 异步准备队列
  private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>(); // 异步执行队列
  private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();   // 同步执行队列

  synchronized void enqueue(AsyncCall call) {
    if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) {
      runningAsyncCalls.add(call);
      executorService().execute(call); // 线程池执行
    } else {
      readyAsyncCalls.add(call);
    }
  }
  // ...
}

可以看到,Dispatcher 定义了三个对列,存放各个状态的任务,方便对各个状态的任务进行管理。调用了 Dispatcher.enqueue() 后会根据当前请求数量来控制任务是否执行,若当前请求数量过多,则先存储在异步等待队列当中。


那存储在等待队列啥时候才能宠幸这里面的任务呢?先来看操作准备队列的方法 Dispatcher.promoteCalls():

package okhttp3;

public final class Dispatcher {
  // ...

  private void promoteCalls() {
    if (runningAsyncCalls.size() >= maxRequests) return; // 是否达到最大请求次数
    if (readyAsyncCalls.isEmpty()) return; // 判断准备队列是否为空

    for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) {
      AsyncCall call = i.next();

      if (runningCallsForHost(call) < maxRequestsPerHost) {
        i.remove();
        runningAsyncCalls.add(call);
        executorService().execute(call); // 线程池执行
      }

      if (runningAsyncCalls.size() >= maxRequests) return; // 是否达到最大请求次数
    }
  }
  // ...
}

这个方法就是查询准备队列是否还有未执行的任务,若有则在线程池中执行


那在异步请求中这个方法什么时候会执行呢?

package okhttp3;

final class RealCall implements Call {

  final class AsyncCall extends NamedRunnable {
    // ...

    @Override protected void execute() {
      try {
        // ...异步请求
      } catch (IOException e) {
        // ...异常处理
      } finally {
        client.dispatcher().finished(this); // 调用
      }
    // ...
  }
}


// Dispatcher

  void finished(AsyncCall call) {
    finished(runningAsyncCalls, call, true);
  }

  private <T> void finished(Deque<T> calls, T call, boolean promoteCalls) {

      if (promoteCalls) promoteCalls(); // 调用了 promoteCalls()
  }

异步请求后调用了 finished(),最终会去轮询准备队列查看是否还有未执行的任务。这就是异步请求的完整流程。

同步比较简单,直接往同步请求队列加任务,就不展开了


总结:OkHttp 的分发器在网络请求过程中起着非常重要的作用,它有效地管理并发请求、优化请求的顺序和执行,以及管理连接池和线程池,从而提供高效、可靠的网络请求功能。文章来源地址https://www.toymoban.com/news/detail-521345.html

到了这里,关于Android Okhttp3 分发器源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Okhttp3添加https自签名证书以及Glide4,Android高级工程师进阶学习—Android热修复原理

    二、自签名证书 什么是自签名证书(self-signed certicates)? 自签名证书就是没有通过受信任的证书颁发机构, 自己给自己颁发的证书. SSL 证书大致分三类: 由安卓认可的证书颁发机构CA(Certificate Authority)(如: VeriSign、DigiCert), 或这些机构的下属机构颁发的证书. 没有得到安卓认可的

    2024年04月17日
    浏览(29)
  • Android OkHttp 源码浅析二

    OkHttp 配置参数: dispatcher 用于线程调度 connectionPool 连接池  64 个or 5 host 可以提升复用性 方便管理和提升性能 interceptors  networkInterceptors eventListenerFactory 事件监听器 连接建立 发送head body 等 retryOnConnectionFailure 连接 / 请求 失败是否重置 authenticator 自动认证修正 比如

    2024年02月11日
    浏览(25)
  • Android Okhttp 源码浅析三

    添加网络事件拦截器 Interceptor val chain = RealInterceptorChain(         call = this,         interceptors = interceptors,         index = 0,         exchange = null,         request = originalRequest,         connectTimeoutMillis = client.connectTimeoutMillis,         readTimeoutMillis = client.readTimeoutMillis,      

    2024年02月11日
    浏览(28)
  • Android OkHttp 源码浅析一

    演进之路:原生Android框架不好用 ---- HttpUrlConnect   和 Apache HTTPClient   第一版  底层使用HTTPURLConnect   第二版 Square构建 从Android4.4开始 基本使用: 同步方法,Deque 双向队列 executableCalls 添加到calls 然后取出遍历 执行 executeOn runningAsyncCalls 正在执行的Call    for (i in 0 until e

    2024年02月11日
    浏览(30)
  • SpringBoot 整合okHttp3 okhttp3用法 okhttp整合 okhttp用法 SpringBoot 整合okHttp3

    GET 请求需要传递 application/json 参数 上述代码中,通过创建ConnectionPool对象,并将其设置到OkHttpClient中,从而启用了连接池功能。ConnectionPool的构造函数接受三个参数:maxIdleConnections、keepAliveDuration和timeUnit,用于配置连接池的最大空闲连接数、连接保持时间以及时间单位。 连

    2024年02月15日
    浏览(37)
  • Android OkHttp源码阅读详解一

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 前言:源码阅读基于okhttp:3.10.0 Android中OkHttp源码阅读二(责任链模式) 1、首先回顾OkHttp的使用 2、OkHttp源码阅读之线程池详解 3、守护线程详解 4、根据OkHttp中构

    2024年02月10日
    浏览(31)
  • Android中OkHttp源码阅读二(责任链模式)

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 Android OkHttp源码阅读详解一 一、首先写一个案例熟悉责任链模式 1、定义一个抽象类BaseTask 2、定义四个Task类,都继承自BaseTask,这里只写一个其它三个同理

    2024年02月10日
    浏览(25)
  • web3j 引用报错:okhttp3.RequestBody okhttp3.RequestBody.create(java.lang.String, okhttp3.MediaType)解决

    在做区块链开发时引用了web3j,而web3j中又引用了OKhttp,在程序发起请求时报错如下 我项目中引用的web3j包如下 其实具体web3j哪个版本感觉都有类似问题,我尝试过4.6.3版本到5.0.0都会报上述错。然后看项目依赖发现引用的OKhttp版本是3.14.9,网上说要将OKhttp版本号更换到4.3.1以上

    2024年02月09日
    浏览(26)
  • Java OkHttp3工具类

    okhttp3现在基本都在用的一个底层网络框架。这篇博客主要的目的就是将OKHttp3这个框架在开发中能用到的地方都记录下来,也当一个工具文档为日后使用时查找方便。 https://github.com/toutouge/javademosecond/tree/master/hellolearn

    2024年03月17日
    浏览(31)
  • com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析

    维护者 square组织 许可证类型 Apache License 2.0 首次发布 2016 年 1 月 2 日 最新发布时间 2023 年 4 月 23 日 GitHub Star 44403 GitHub Fork 9197 依赖包 5,582 依赖存储库 77,217 com.squareup.okhttp3:okhttp 一个开源的 HTTP 客户端库,可以用于 Android 和 Java 应用程序。它提供了一种简单而强大的方式来发

    2024年02月10日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包