okHttp源码总结

1.创建OkHttp的时候 构造就会给我们new Builder()方法


这个方法中我们创建了一个Dispatcher分发器

这个Dispatcher分发器会自动创建runningAsyncCalls异步等待对列

和runningSyncCalls同步等待对列

2. 创建请求对象


3.通过okhttp对象.newCall(请求对象) 获取call对象

通过call对象调用 同步或者异步 发起网络请求

Call 的实现类 RealCall

因为 Call 是接口,内部定义了同步与异步的请求,

以及取消请求等操作,这些操作是由 RealCall 真正去实现的。

同步:call对象.execute()


源码详解:

通过OkHttpClient对象调用分发器方法调用executed()方法

把所有的RealCall对象(RealCall继承与Call)添加到同步等待对列


然后依次执行

同时调用了getResponseWithInterceptorChain()拦截器方法()

依次执行7个拦截器  再循环 返回Response对象 如果一个拦截器出错误

那么就没有数据


拦截器方法:


获取数据:通过同步对象.body().string();

.body()从Response.body()中取值

当调用数据以后再次调用会报错 因为我们调用一次后

okhttp关闭读取流 所有就无法重复调用

异步: 

源码详解:

通过OkHttpClient对象调用分发器方法调用enqueue(new AsyncCall(接口回调))方法


RealCal内部有executeOn(线程池)方法 execute()处理数据  给responseCallback赋值


当我们调用AsyncCall这个接口 会自动调用executeOn方法 同时接口回调赋值给我们

client对象responseCallback 返回给两个方法数据


当调用数据以后再次调用会报错 因为我们调用一次后

okhttp关闭读取流 所有就无法重复调用

更多可参考:OKHTTP异步和同步请求简单分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容