最近看了OkHttp(3.11.0)的源码,想总结下自己对OkHttp的认识,加深印象,如有不对的地方欢迎各位大佬指正。
1、OkHttp简单的异步请求。
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
}
@Override
public void onFailure(Call call, IOException e) {
}
});
OkHttp的请求分四步:
- 1.创建OkHttpClient对象
- 2.创建Request对象封装请求url以及请求参数
- 3.通过OkhttpClient对象和Request对象得到Call对象
- 4.最终通过Call对象来执行请求。
2、通过跟踪Call的enqueue方法探索OkHttp的请求过程
3、探索AsyncCall类的真面目
4、回过头我们看下Dispatcher的enqueue方法
5、这时候再看AsyncCall的execute方法
6、总结Okhttp内容进行一次网络请求流程。
- 1、ReallCall对象的enqueue方法创建一个内部类AysncCall对象。
- 2、调用Diapatcher的enqueque方法判断是否满足执行此AysncCall条件,满足则将其加入到正在执行的请求队列中,并开始执行,不满足则将其加入到等待执行的请求队列中。
- 3、AysncCall的execute方法通过OkHttp一系列的拦截器生成这次请求的Response对象,通过CallBack对象将请求结果传递给调用者。
- 4、调用Diapatcher的finished的方法将此AysncCall对象从正在执行的队列中移除,遍历等待执行的队列,从中取出满足执行条件的AysncCall对象,将其添加到正在执行的队列中,并执行此AysncCall对象。如此这样反复循环。
- 5、这里总结的是一次请求是怎么被分配执行的,而请求生成结果的核心还是在AysncCall的execute方法中的第147行,通过拦截器链生成返回结果。