okhttp网络框架源码解析五okhttp网络框架源码解析异步请求执行流程之线程池

241 篇文章 5 订阅

1、在满足运行的并发请求数小于64并且请求数小于5时,就会调用线程池执行runnable对象call

 

 

2、executorService ()方法

这个方法是用synchronized关键字修饰的,主要是为了保证ExecutorService这个线程池对象是单例,这个方法返回的就是一个线程池单例对象这个线程池的创建,参数主要是两个,一个是第一个参数,corepoolsize,设置为0,还有一个是最大线程池的数量,设置为Integer.MAX_VALUE,最大值。如果当网络请求特别特别多的时候,比如是integer的最大值,这时候性能消耗是不是特别大?其实是不会的,在dispatcher中已经定义了maxRequests=64这个值,这就限制了整个okhttp异步请求不会超过64的,所以说,就算在创建线程池时设置了整数的最大值,也是没有影响的。

 

 

3、executor Service().execute(call)

在创建好了线程池后,就会调用execute(call)这个方法。由于它是一个线程池,所以会调用每个子线程的run()方法,这时会调用AsyncCall的run()方法

 

4、AsyncCall继承了NamedRunnable,而在这个AsyncCall当中,没有run()方法,那么就去NamedRunnable中看一下有没有run()方法

 

5、NamedRunnable中是有run()方法的,但是它的run()方法也只是包装了一层,主要实现还是在execute()这个方法里面。而execute()又是一个抽象方法,所以这时候要到AsyncCall中的execute()方法中看一下实现。

 

6、这时候看到AsyncCall的execute()方法才是真正实现操作的地方。

147行调用了方法getResponseWithInterceptorChain()获取返回结果Response。个体Response With Interceptor Chain()这个方法就是构建了一个拦截器的链,而每一个拦截器中的链又是有不同的作用的。

148行判断这个拦截器中的一个拦截器retryAndFollowUpInterceptor叫重定向和重试拦截器,这个拦截器是否取消了,如果取消了会调用callback的onFailure()这个方法。这个callback就是在call.enqueue(AsyncCallback callback)传入进来的callback;如果没有被取消,就会进入callback.onResponse()这个方法当中。真正发送请求的就是responseCallback.onResponse()这个方法。不管是onFailure()还是onResponse(),这里的操作都是在子线程当中的。

catch块主要处理网络请求失败的操作,主要是打印了一些日志,最后也会回调onFailure()方法。

finnally中调用了dispatcher的finished(this)方法

 

这个finished()方法其实还调用了一个三个参数的finished()方法。

这个其实也是dispatcher分发器中一个很重要的方法。这个三个参数的finished方法做了三样事。

首先,调用了calls.remove(call)这个方法,将当前的请求从正在执行的异步请求中移除。

其次调用了promoteCalls()这个方法。这个方法的作用是调整整个异步请求的任务队列。其实,这个异步请求队列是非线程安全的,所以在调用promoteCalls()方法的时候,用synchronized关键字锁住了,出于线程安全的考虑。

第三个,会通过方法runningCallsCount()方法重新计算正在运行的线程数量,并赋值给runningCallsCount。因为这个变量在后面有进行判断,如果它为0并且不为空的话,会执行相应的操作。

 

7、这个网络请求在完成相应的请求之后,还是会回调callback方法。比如成功的话会调用onResponse()方法,成功的话会调用onFailure()方法,而请求到的结果会在onresponse这个参数当中。还有需要注意的是,这两个方法都是在子线程。如果需要做一些更新UI的操作,一定要切换到主线程。

 

8、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值