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异步和同步请求简单分析
网友评论