美文网首页
OkHttp3(八)--RealCall

OkHttp3(八)--RealCall

作者: azu_test | 来源:发表于2019-01-28 11:01 被阅读0次

RealCall

  • 它将会对请求做最后操作,例如异步请求、同步请求、取消请求等操作。
  • 它实现了Call接口,其中Call接口内定义了异步请求、同步请求、取消请求等方法。
  • 创建拦截器链表,并通过拦截器链表请求网络获取数据。

Call接口代码

public interface Call extends Cloneable {
  /** 获取请求封装的数据*/
  Request request();
  /** 同步请求*/
  Response execute() throws IOException;
  /** 异步请求*/
  void enqueue(Callback responseCallback);
  /** 取消请求*/
  void cancel();
  boolean isExecuted();
  boolean isCanceled();
  Timeout timeout();
  Call clone();
  interface Factory {
    Call newCall(Request request);
  }

Call接口的实现类: RealCall

部分重要代码摘抄

final class RealCall implements Call {
  @Override public Request request() {
    return originalRequest;
  }

  @Override public Response execute() throws IOException {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    timeout.enter();
    eventListener.callStart(this);
    try {
      client.dispatcher().executed(this);
      /** 做真正网络请求*/
      Response result = getResponseWithInterceptorChain();
      if (result == null) throw new IOException("Canceled");
      return result;
    } catch (IOException e) {
      e = timeoutExit(e);
      eventListener.callFailed(this, e);
      throw e;
    } finally {
      client.dispatcher().finished(this);
    }
  }
  @Override public void enqueue(Callback responseCallback) {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    eventListener.callStart(this);
    client.dispatcher().enqueue(new AsyncCall(responseCallback));
  }

  @Override public void cancel() {
    retryAndFollowUpInterceptor.cancel();
  }

  @Override public Timeout timeout() {
    return timeout;
  }

  @Override public synchronized boolean isExecuted() {
    return executed;
  }

  @Override public boolean isCanceled() {
    return retryAndFollowUpInterceptor.isCanceled();
  }

  @SuppressWarnings("CloneDoesntCallSuperClone") 
  @Override public RealCall clone() {
    return RealCall.newRealCall(client, originalRequest, forWebSocket);
  }

  StreamAllocation streamAllocation() {
    return retryAndFollowUpInterceptor.streamAllocation();
  }
  //异步请求内部类
  final class AsyncCall extends NamedRunnable {
    private final Callback responseCallback;

    AsyncCall(Callback responseCallback) {
      super("OkHttp %s", redactedUrl());
      this.responseCallback = responseCallback;
    }

    String host() {
      return originalRequest.url().host();
    }

    Request request() {
      return originalRequest;
    }

    RealCall get() {
      return RealCall.this;
    }

    //通过Dispatcher调用到此异步内部类内,然后做异步请求操作
    void executeOn(ExecutorService executorService) {
      assert (!Thread.holdsLock(client.dispatcher()));
      boolean success = false;
      try {
        executorService.execute(this);
        success = true;
      } catch (RejectedExecutionException e) {
        InterruptedIOException ioException = new InterruptedIOException("executor rejected");
        ioException.initCause(e);
        eventListener.callFailed(RealCall.this, ioException);
        responseCallback.onFailure(RealCall.this, ioException);
      } finally {
        if (!success) {
          client.dispatcher().finished(this); // This call is no longer running!
        }
      }
    }
    //在Run()方法内执行
    @Override protected void execute() {
      boolean signalledCallback = false;
      timeout.enter();
      try {
        Response response = getResponseWithInterceptorChain();
        if (retryAndFollowUpInterceptor.isCanceled()) {
          signalledCallback = true;
          responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
        } else {
          signalledCallback = true;
          responseCallback.onResponse(RealCall.this, response);
        }
      } catch (IOException e) {
        e = timeoutExit(e);
        if (signalledCallback) {
          Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
        } else {
          eventListener.callFailed(RealCall.this, e);
          responseCallback.onFailure(RealCall.this, e);
        }
      } finally {
        client.dispatcher().finished(this);
      }
    }
  }
  //实例化拦截器列表,并做网络请求
  Response getResponseWithInterceptorChain() throws IOException {
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    interceptors.add(retryAndFollowUpInterceptor);
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    interceptors.add(new CacheInterceptor(client.internalCache()));
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
    interceptors.add(new CallServerInterceptor(forWebSocket));

    Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
        originalRequest, this, eventListener, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());

    return chain.proceed(originalRequest);
  }
}
  • 上面的大部分代码已经在OkHttp3(六)--Dispatcher一文中贴出并做过解析,此处就不在做过多的解释。
  • OkHttp3(六)--Dispatcher一文中也说明,网络请求最终来到getResponseWithInterceptorChain()方法,我们看一下它都做了哪些操作。

getResponseWithInterceptorChain()源码

  Response getResponseWithInterceptorChain() throws IOException {
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    //添加重定向拦截器
    interceptors.add(retryAndFollowUpInterceptor);
    //添加桥接拦截器
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    //添加缓存拦截器
    interceptors.add(new CacheInterceptor(client.internalCache()));
    //添加链接拦截器
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
    //添加读写拦截器(请求服务器拦截器)
    interceptors.add(new CallServerInterceptor(forWebSocket));
    //实例化拦截器列表
    Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
        originalRequest, this, eventListener, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());
    //执行链表拦截
    return chain.proceed(originalRequest);
  }
  • 上面代码有看到创建了一连串的拦截器,并且将拦截器赋给了RealInterceptorChain(拦截器链表)
  • 拦截器链表最终执行了方法RealInterceptorChain.proceed()去做一系列的网络拦截操作,而最终获取到网络数据。

上文已经进入到RealInterceptorChain方法内部,下篇我们将单独介绍一下RealInterceptorChain是怎么运行的,并且是怎么按照顺序遍历拦截的。

下篇入口:OkHttp3(九)--RealInterceptorChain

相关文章

网友评论

      本文标题:OkHttp3(八)--RealCall

      本文链接:https://www.haomeiwen.com/subject/lgzojqtx.html