1、
这个拦截器是步区分同步还是异步的,也就是说不管是同步还是异步都会使用到拦截器这个功能来进行实际的网络功能的获取。
2、
拦截器有两种,一种是application类的拦截器,一种是network类型的网络拦截器,而我们关心的是OkHttpCore,这是okhttp提供给我们的系统内部的拦截器。
3、
这是okhttp提供给我们的内部拦截器,就是当发送一个请求的时候,okhttp会通过一个拦截器的链来执行http的请求。
RetryAndFollowUpInterceptor:重试和失败重定向拦截器。在这个拦截器主要做的是一些初始化操作,还会创建一个streamallocation这个对象,用来传递给后面的拦截器。
在重试和失败重定向拦截器之后是如下两个拦截器。
BridgeInterceptor:桥接和适配拦截器。
CacheInterceptor:缓存拦截器。缓存拦截器和桥接拦截器主要是用来补充用户创建请求中缺少的一些必须的请求头和处理缓存的一些功能。
紧接着是okhttp中两个比较核心的拦截器,这两个其实是okhttp网络交互的关键。
ConnectInterceptor:连接拦截器。主要负责建立可用的连接。其实connectinterceptor是callserverinterceptor的基础。
CallServerInterceptor:主要负责将okhttp的请求写进服务器的io流,并且从服务器的io流中读取服务端返回给我们的数据。
4、以同步为例说明
其实,同步和异步是一样的。执行同步请求的话,会调用call.execute()方法。
call是一个接口,所以具体实现在它的子类中实现。
realcall中的execute()方法
76行就是将同步请求加入到dispatcher来进行管理。其实dispatcher做的非常简单,就是将同步请求加入到同步队列当中。
84行是告诉分发器任务已经执行完了。
77行有一个getResponseWithInterceptorChain()方法,返回是的response对象
getResponseWithInterceptorChain()方法其实就是构成一个拦截器的链,通过依次执行不同功能的拦截器来获取服务器的响应、返回,这就是它的主旨。
186行添加了一个用户自定义的拦截器,也就是应用程序拦截器。在okhttp官网当中,分为两个拦截器,一个是应用程序拦截器,一个是网络拦截器。而187行到194行是okhttp内部提供给我们的拦截器。192行的interceptors不是okhttp系统内部提供给我们的拦截器,而是network网络拦截器。
196行创建了一个Interceptor.Chain对象,在构造方法中将所有拦截器传入了进去
调用它的proceed方法来执行相应的请求。
intercepter.Chain是一个接口,所以看它的具体实现类RealInterceptorChain中的实现
proceed这个方法,最终还是调用了传入四个参数的这个proceed()方法
这个方法主要是一些参数的变化
主要从preoceed()方法的143行开始看。
首先做的也就是创建一个拦截器的链,这个链和刚才的链有什么区别呢?
144行它传入的参数是index+1,也就是说下面想要访问的话,只能从下一个拦截器开始访问,而不能从当前拦截器。这样做的话也就把我们所有的拦截器构成了一个链条。
147行执行获取索引为index的拦截器,然后将获取到的拦截器的链传入进去,这样就将所有的拦截器构成了一个链条。
proceed()方法的核心是创建下一个拦截器。
5、重定向拦截器所执行的功能
重定向拦截器的125行,它执行的是拦截器链中的proceed()方法,而proceed()内部会执行下一个拦截器内部的proceed()方法,这样就印证了整个拦截器链就完整地交替执行,最终就可以将所有相关拦截器功能都做完。这也是okhttp拦截器的核心执行逻辑。也可以把okhttp的网络请求看成一个一个拦截器执行它的intercept()方法的过程。
6、
7、