1、
RetryAndFollowUpInterceptor:主要负责失败重连的。
比如说需要失败重连,就可以在okhttpclient中进行配置,但是需要注意的是,并不是所有的网络请求,当它失败后都可以进行重连的,它是有一定的限制范围的。所以okhttp内部,就会进行网络请求异常和响应码的判断,如果都在它的判断范围内的话,就可以进行网络请求的重连。主要看它的intercept()这个最关键的代码
111行,创建了streamAllocation这个对象,streamallocation实际上就是建立、执行http网络请求所需要的网络的组件的。从它的名字上可以判断,它所做的其实就是stream allocation,用来分配stream。需要注意的是,这个streamallocation对象虽然在RetryAndFollowUpInterceptor中创建好了,但是它在这个拦截器中并没有被使用到。真正被使用是在下一个拦截器中。它主要是用于获取服务端的connection连接,和用于服务端用于进行数据传输的输入输出流。它是依次通过拦截器链传给下一个拦截器。
在整个拦截器的拦截过程,可以把它理解为一个递归的过程,也就是说,它的内部会通过要给realInterceptorChain这个类去负责所有的拦截器,并把它们串联起来。所以说,只有当所有的拦截器执行完以后,这个okhttp网络请求才会返回response。但是在实际开发过程中,网络本来就是不稳定的,在执行过程中肯定会出现不同程度的问题,比如说连接中断了,或者失败了,都是有可能的,这个时候response的返回码code就不是正常的200了,因此这个response就不一定是可以用的,或者说在请求过程中已经抛出异常了,那么此时,这个retryandfollowupinterceptor是怎么帮我们进行拦截的呢?
它所有的逻辑都在while循环中。
2、在while(true)while循环中
在168行,对重试的次数进行判断,因为不可能无限次地去进行网络请求,
MAX_FOLLOW_UPS设置的值为20。意思是这个RetryAndFollowUpInterceptor拦截器会对失败的网络进行重连,但是不是无限制的,当okhttp内部超过了20次网络重连请求,就不会再进行请求了,这时候做的就是释放这个streamAllocation对象。这也是整个的网络失败重连接的核心流程,有一个跳出的逻辑。
3、
RetryAndFollowUpInterceptor是第一个拦截器,也是最重要的一个拦截器,因为它创建的streamAllocation是核心之一。这个对象是执行网络请求所需要的网络的组件,它的作用就是用来分配stream。