工作分析:
1、创建Call
同步:
2、将Call直接添加到Dispatcher的runningAsyncCalls队列中,同时
3、调用getResponseWithInterceptorChain进入链式工作流程
4、将Response返回给调用者
5、调用Dispatcher的finish移除该Call,并调用promoteCalls检查队列,执行等待的请求
异步
2、将使用Callback为参数创建AsyncCall对象,并将其添加到Dispatcher的队列中,等待队列执行
3、队列中取出待执行的请求,使用线程池执行AsyncCall(继承Runnable),执行getResponseWithInterceptorChain,并将结果通过callback返回
Dispatcher中的三个队列:
- readyAsyncCalls:准备运行的异步请求
- runningAsyncCalls:正在运行的异步请求
- runningSyncCalls:正在运行的同步请求
getResponseWithInterceptorChain中拦截器的工作分析
图2:创建链并开始执行的代码 图3:proceed方法的主要代码 图4:Interceptor的intercept方法链的工作流程:
1、在getResponseWithInterceptorChain创建链条,并执行proceed方法 (图2所示)
2、在链条的proceed方法中,取出拦截器,并调用拦截器的intercept方法(图3所示)
3、intercept方法中,对请求进行处理,然后通过链条的proceed获取返回(图4所示)
4、此时的链条的index已经加1,proceed中拿到下一个拦截器,然后执行第3步;如此递归到最后一个拦截器执行第5步
5、最后一个拦截器获取到返回之后,依次递归,每个拦截器去处理返回的response,然后返回给上一个拦截器处理
6、执行到最后回到第一个链的起点,把数据返回给对应的调用(图2的retrun)
对于每个拦截器的功能可以查看上一篇文章OKHttp -- 结构分析
网友评论