引子
OkHttp
知名第三方网络框架SDK
,使用简单,性能优秀,但是内核并不简单,此系列文章,专挑硬核知识点详细讲解。何为硬核,就是要想深入研究,你绝对绕不过去的知识点。
TIPS:声明:拦截器种细节太多,要一一讲解不太现实,所以我挑了其中最实用的一些要点加以总结。
详细讲解 OKHttp
的核心内容,拦截器。不过拦截器众多,有系统自带的,也有我们可以自己去自定义的。
大家可以先看首篇-你必须学会的OKHttp
(顺手留下GitHub链接,需要获取相关面试或者面试宝典核心笔记PDF等内容的可以自己去找)
https://github.com/xiangjiana/Android-MS
更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取
这是网络请求执行的核心方法的起点,这里涉及了众多拦截器。
正文大纲
系统自带拦截器
1 重试与重定向拦截器
RetryAndFollowUpInterceptor
2 桥接拦截器
3 缓存拦截器CacheInterceptor
4 连接拦截器ConnectInterceptor
5 服务调用拦截器CallServerInterceptor
正文
在详解拦截器之前,有必要先将 RealCall
的 getResponseWithInterceptorChain()
方法最后两行展开说明:
Interceptor.Chain chain = newRealInterceptorChain( interceptors, null, null, null, 0, originalRequest);
return chain.proceed(originalRequest);
这里最终返回 一个 Response
,进入 chain.proceed
方法,最终索引到 RealInterceptorChain
的 proceed方法:
之后,我们追踪这个 interceptor.intercept(next)
; ,发现是一个接口,找到实现类,有多个,进入其中的 RetryAndFollowUpInterceptor
,发现:
它这里又执行了 chain.proceed
,于是又回到了 RealInterceptorChain.proceed()
方法,但是此时,刚才链条中的拦截器已经不再是原来的拦截器了,而是变成了第二个,因为每一次都 index+1了(这里比较绕,类似递归,需要反复仔细体会),依次类推,直到所有拦截器的intercept
方法都执行完毕,直到链条中没有拦截器。就返回最后的 Response
。
这一段是 okhttp
责任链模式的核心,应该好理解
系统自带拦截器
1. 重试与重定向拦截器 RetryAndFollowUpInterceptor
先说结论吧:
顾名思义,retry 重试,
FollowUp
重定向 。这个拦截器处在所有拦截器的第一个,它是用来判定要不要对当前请求进行重试和重定向的,
那么我们应该关心的是: 什么时候重试, 什么时候重定向。并且,它会判断用户有没有取消请求,因为RealCall
中有一个cancel方法,可以支持用户 取消请求(不过这里