帮助我理解的OkHttp博客:
OkHttp3.x解析(二)OkHttp源码以及工作流程解析.
下面这个图搭配源码看真的很容易理解:
OkHttpClient.java源码中newCall()方法
从上图可看出创建Call对象后实际调用的是RealCall.newRealCall(**)方法,接下来我们进去看RealCall里面可以干什么
RealCall.java里面定义的同步请求方法
可以从流程图和源码中看到,实际获取response,执行网络请求 *** 作的方法是我用红框框出来的那个getResponseWithInterceptorChain()的方法,大概意思我觉得就是获取拦截器链捕获到的网络请求的内容。后面会说到这个方法。
RealCall里面定义的异步请求方法
从流程图和源码来看,异步请求方法中调用的是client.dispatcher().enqueue(***)方法,点进这个enqueue方法看是在Dispatcher.java里面
这个方法主要就是将异步任务AsyncCall添加到Dispatcher中维护的队列readyAsyncCalls中等待执行。
从流程图中可以看出,无论是同步请求还是异步请求,最终都是交给RealCall#getResponseWithInterceptorChain()执行网络请求 *** 作。
RealCall#getResponseWithInterceptorChain()方法:
附:Interceptor(拦截器)
首先,从上面的源码图可以看出OkHttp创建了一个列表对象之后把 client 中的拦截器、重连拦截器(RetryAndFollowUpInterceptor)、桥拦截器(BridgeInterceptor)、缓存拦截器(CacheInterceptor)、网络连接拦截器(ConnectInterceptor)和服务器请求拦截器(CallServerInterceptor)等依次加入到列表中。
然后,用这个列表创建了一个Interceptor.Chain(拦截器链)。这里使用了责任链设计模式,每当一个拦截器执行完毕之后会调用下一个拦截器或者不调用并返回结果。
最终,拿到的Response响应就是这个链条执行之后返回的结果。当我们自定义一个拦截器的时候,也会被加入到这个拦截器链条里。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)