快捷搜索: 王者荣耀 脱发

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、配置了拦截器,并且开始向拦截器提交请求体

经验分享 程序员 微信小程序 职场和发展