Android:OkHttp请求分发器 Dispatcher的理解和使用

OkHttp请求分发器 Dispatcher的理解和使用

  • OkHttp 请求分发器 Dispatcher
  • 参考

OkHttp 请求分发器 Dispatcher

Android:OkHttp请求分发器 Dispatcher的理解和使用_第1张图片
当我们调用了 RealCallexecute()enqueue() 方法后,RealCall 会调用 Dispatcher 对应的 execute() 和 enqueue() 方法,请求分发器 Dispatcher 的 execute() 方法只是简单地把同步请求加入同步请求队列,下面我们来看下 Dipsatcher 中比较重要的 enqueue() 方法的实现。

1、Dispatcherenqueue() 方法首先会把请求加入到待运行请求队列,然后重用 AsyncCallcallsPerHost 字段callsPerHost 表示当前请求的主机地址的已执行请求数量

2、在我们把某个异步请求加入队列时,Dispatcher 会从已运行异步请求队列和待运行异步请求队列中找出与该请求主机地址相同的请求,找到主机相同的请求的话,就重用该请求的 callsPerHost 字段,也就是是每执行一个该主机地址的请求时,这个值就会加 1

3、如果我们的应用中经常会发起多个请求,并且请求的主机地址不多时,我们可以修改 Dispatcher 中的 maxRequestsPerHost 的值,比如下面这样。

okHttpClient.dispatcher.maxRequestsPerHost = 10

这个值默认为 5 ,也就是单个主机地址在某一个时刻的并发请求只能是 5 个。
Android:OkHttp请求分发器 Dispatcher的理解和使用_第2张图片
4、做完重用操作后,Dispatcher 就会创建一个可执行异步请求列表 executableCalls ,然后遍历待运行异步请求队列。

5、在遍历时,Dispatcher 会判断已运行的异步请求数量是否超出了允许的并发请求的最大值 maxRequests ,这个值默认为 64 ,也是可以被修改的。

6、当异步请求数量不超过最大值,并且对应主机地址的请求数量不超过最大值时,就会把该异步请求加入到 executableCalls ,然后把 executableCalls 中的请求都提交到线程池中执行。

参考

1、https://www.jianshu.com/p/5a12ae6d741a

你可能感兴趣的:(Android,OkHttp,Dispatcher)