OKHttp:

193 阅读2分钟

OKHttp:

okHttp的时序图****

 1、初始化 创建 OKHttpClient

   具体实现:

OkHttpClient okHttpClient = getOkHttpClientBuilder().build(),通过建造者的模式创建,(建造者模式在创建对象的时候,参数很多一般就用建造者模式)2、创建Request

Request request = new Request.Builder()
            .url("http://xxxxxx")
            .build();3、创建Call 对象

client.newCall(request).enqueue(new Callback() {//3

        @Override
        public void onFailure(Call call, IOException e) {
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if(response.isSuccessful()){//回调的方法执行在子线程。
                
            }
        }
    });发送网络请求:分为两种:1.同步请求

client.newCall(request).execute()

execute()就是调用RealCall中的 execute()方法

@Override public Response execute() throws IOException {  synchronized (this) {    if (executed) throw new IllegalStateException("Already Executed");    executed = true;  }  captureCallStackTrace();  try {    client.dispatcher().executed(this);    Response result = getResponseWithInterceptorChain();    if (result == null) throw new IOException("Canceled");    return result;  } finally {    client.dispatcher().finished(this);  }}上图中的这段代码

client.dispatcher().executed(this);执行就会调用以下代码

@Override protected void execute() {    boolean signalledCallback = false;    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) {      if (signalledCallback) {        // Do not signal the callback twice!        Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);      } else {        responseCallback.onFailure(RealCall.this, e);      }    } finally {      client.dispatcher().finished(this);    }  }}以上代码中的

Response response = getResponseWithInterceptorChain();这段代码就是网络请求的核心代码,拦截器中的 以下会重点解说此段代码的功能,同步请求和一步请求都是使用的这个代码得到网络请求的结果

2.异步请求

client.newCall(request).enqueue(new Callback() {//3

        @Override
        public void onFailure(Call call, IOException e) {
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if(response.isSuccessful()){//回调的方法执行在子线程。
                
            }
        }
    });

以上代码调用 enqueue()方法

@Override public void enqueue(Callback responseCallback) {  synchronized (this) {    if (executed) throw new IllegalStateException("Already Executed");    executed = true;  }  captureCallStackTrace();  client.dispatcher().enqueue(new AsyncCall(responseCallback));}会通过 client.dispatcher()的enqueue方法创建一个AsyncCall,

Dispatcher的enqueue就会判断当前的请求数量是否大于总请求数量和单个主机的请求数量是否大于单个主机的请求数量,判断满足就执行,否则添加队列中等待

synchronized void enqueue(AsyncCall call) {  if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) {    runningAsyncCalls.add(call);    executorService().execute(call);  } else {    readyAsyncCalls.add(call);  }}

executorService().execute(call);执行 AsyncCall

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;  }  @Override protected void execute() {    boolean signalledCallback = false;    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) {      if (signalledCallback) {        // Do not signal the callback twice!        Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);      } else {        responseCallback.onFailure(RealCall.this, e);      }    } finally {      client.dispatcher().finished(this);    }  }}

异步代码到此,和同步代码都执行到了

Response response = getResponseWithInterceptorChain();接下来分析下 getResponseWithInterceptorChain();具体做了些什么

Response getResponseWithInterceptorChain() throws IOException {  // Build a full stack of interceptors.  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);  return chain.proceed(originalRequest);}此方法中添加了大量的拦截器,拦截器采用了责任链模式,拦截器通过list集合的形式添加到最后的

RealInterceptorChain中,执行 proceed 方法是一个一个往下执行拦截器

retryAndFollowUpInterceptor拦截器执行重连和重定向操作

BridgeInterceptor桥链接拦截器,添加请求头的拦截器

CacheInterceptor缓存拦截器 ,

ConnectInterceptor连接拦截器  ,tcp连接

CallServerInterceptor发送请求OKHttp流程图