okhttp 原理笔记三:RealCall
RealCall 是哪里来的呢?故事的开始是从下面揭开的:
okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } });
这里,我们通过 okhttpclient 通过newCall 方法,返回了一个对象,然后,调用这个对象的enqueue方法,并且传了一个Callback 接口对象等待结果的回调。 然后,我们先看看这个newCall方法返回的是什么
/** * Prepares the {@code request} to be executed at some point in the future. */ @Override public Call newCall(Request request) { return RealCall.newRealCall(this, request, false /* for web socket */); }
这个 newCall 是被重写了,我们看下是重写谁的方法
public interface Call extends Cloneable { //省略代码 interface Factory { Call newCall(Request request); } }
这个其实是Call接口中内置的工厂接口,也就是说,okhttpclient 实现了 Call中内置的工厂接口,重写了接口里的 newCall 方法
public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {
它返回的是一个Call 类型的对象, 同时,这个对象是由RealCall 的newRealCall 方法返回的。我们看下这个RealCall 的实现
final class RealCall implements Call {
它也实现了Call 接口,那么这个Call 对象的 enqueue 方法呢?我们看下
public interface Call extends Cloneable { void enqueue(Callback responseCallback);
也是Call 接口的方法,留待子类实现,然后通过接口被调用。
如此一来,目前知道的是:
newCall 方法 是 Call.Factory 接口的方法,okhttpclient 通过实现Call.Factory接口,把 RealCall 搞出来。
enqueue 方法是 Call 接口的方法,RealCall 通过实现Call 接口,重写了enqueue 方法。
我们看看RealCall 主要做了什么东西
我在代码里做了一些注释,方便认识。
但总的来说,RealCall主要做了以下:
1、接收开发者传进来的请求信息,这些请求信息包括请求的地址,提交的参数body,okp客户端等信息
2、它内置了一个线程的实现,所以,请求都是在线程里面处理的
3、里面分别有同步请求,异步请求两个逻辑处理,其中异步请求是通过 dispatcher 分配的
4、配置了拦截器,并且开始向拦截器提交请求体