1. 秦子帅的博客首页
  2. Android

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

前言

回顾:
Okhttp的基本用法
Okhttp3源码解析(1)-OkHttpClient分析
Okhttp3源码解析(2)-Request分析
Okhttp3源码解析(3)-Call分析(整体流程)
Okhttp3源码解析(4)-拦截器与设计模式

上节讲了拦截器与设计模式,今天讲RetryAndFollowUpInterceptor,如果我们没有去自定义拦截器, 那RetryAndFollowUpInterceptor是第一个拦截器。

初始化

首先先看RetryAndFollowUpInterceptor被添加的位置:

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

初始化位置:
call实例化方法中:

找到了初始化的位置, 下面去RetryAndFollowUpInterceptor种分析!

RetryAndFollowUpInterceptor解析

从上节我们就知道拦截器中的intercept()是核心! 这里贴出代码:

我先贴出一个while循环的流程图:

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

根据流程图和源码可以分析RetryAndFollowUpInterceptor主要做了以下内容,后两点都是发生在while循环

  • 初始化StreamAllocation 对象
  • 网络请求-chain.proceed() ,对在请求时发生的异常进行捕获以及对应的重连机制
  • followUpRequest 对响应码进行处理

下面可以逐块代码分析:

1.初始化StreamAllocation 对象

StreamAllocation类是协调三个实体之间的关系 三个实体是:ConnectionsStreamsCalls
我们请求网络时需要传递它

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

StreamAllocation在这大家简单了解一下就可以了.

2.网络请求时异常捕获-以及重连机制

网络请求如下:

如果请求发现异常,我们通过try/catch捕获

RouteException 路由异常

  • IOException IO异常
    捕获后都做了recover()重连判断,具体代码如下,就不细说了:

这里需要注意的是如果可以重连,执行 continue;
continue含义: 继续循环,(不执行 循环体内continue 后面的语句,直接进行下一循环)

3.followUpRequest 对响应码进行处理

先看看具体followUpRequest方法:

 

不难看出, 是根据响应码进行判断的。

  • HTTP_PROXY_AUTH 407 代理身份验证
  • HTTP_UNAUTHORIZED 401 未授权
  • HTTP_PERM_REDIRECT 308 重定向
  • HTTP_TEMP_REDIRECT 307 重定向
  • HTTP_MULT_CHOICE 300 Multiple Choices
  • HTTP_MOVED_PERM 301 Moved Permanently
  • HTTP_MOVED_TEMP 302 Temporary Redirect
  • HTTP_SEE_OTHER 303 See Other
  • HTTP_CLIENT_TIMEOUT 408 Request Time-Out
  • HTTP_UNAVAILABLE 503 Service Unavailable

对于这些响应码都做了处理:
1.返回null

2.其他异常情况直接抛异常了

强调:
MAX_FOLLOW_UPS字段, 表示最大的重定向次数

这节就说到这,希望对大家有所帮助…..

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor
公众号

原文始发于:Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

发布者:秦子帅,转转请注明出处:http://qinzishuai.cn/index.php/2019/08/20/efd784d9a9/

联系我们

912241847

在线咨询:点击这里给我发消息

邮件:qzs531156@163.com

QR code