OkHttp源码解析(一)

简单使用

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("https://api.github.com/search/repositories")
        .build();

//执行请求的地方.
client.newCall(request)
        .enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d("MainActivity", response.body().source().readUtf8());
            }
        });

OkHttpClient

newCall(Request request)

​ OkHttpClient的newCall(Request request)方法通过调用RealCall的静态方法newRealCall来创建一个用于请求的RealCall

@Override public Call newCall(Request request) {
  return RealCall.newRealCall(this, request, false /* for web socket */);
}

RealCall和Dispatcher

​ RealCall是执行请求的类,关键方法有execute()enqueue()

Dispatcher是调度器,内部管理线程.

execute()方法

  //RealCall的execute()方法
  //关键代码
  @Override public Response execute() throws IOException {
      ... ...
      //调用了Dispatcher的execute()方法
      client.dispatcher().executed(this);
      //调用getResponseWithInterceptorChain()获得Responce
      Response result = getResponseWithInterceptorChain();
      ... ...
  }

RealCall的execute()这是一个同步请求的方法,在方法内部调用了Dispatcher的execute()方法

//Dispatcher的execute()方法.  
//在同步调用的队列里添加一个RealCall
synchronized void executed(RealCall call) {
  runningSyncCalls.add(call);
}

​ Dispatcher的executed(RealCall call)方法只做了一个向同步调用的队列里添加一个RealCall的操作.最关键的方法是在

Response result = getResponseWithInterceptorChain();

​ 下面来看看RealCall的enqueue()方法

enqueue()方法

​ 这是一个异步请求的方法

 //RealCall的enqueue()方法
 //关键代码
 @Override public void enqueue(Callback responseCallback) {
 	... ...
   //调用了Dispatcher的enqueue(AsyncCall call)方法      
   client.dispatcher().enqueue(new AsyncCall(responseCallback));
 }

下面来看看Dispatcher的enqueue(AsyncCall call)方法

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

​ Dispatcher的enqueue(AsyncCall call)对请求队列进行了一些判断,来判断是直接执行call还是将call加入readyAsyncCalls(已经运行异步请求的对列).

​ 然后再来看看 Dispatcher的executorService()方法.

executorService()

public synchronized ExecutorService executorService() {
    if (executorService == null) {
      executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, 	 TimeUnit.SECONDS,
          new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
    }
    return executorService;
  }

executorService()方法做的就是创建一个executorService.然后在回过来看Dispatcher的enqueue()方法

 synchronized void enqueue(AsyncCall call) {
     ... ...
     executorService().execute(call);
     ... ...
 }

Dispatcher的enqueue(AsyncCall call)方法做的最主要的就是用ExecutorService执行AsyncCall,

ExecutorService执行AsyncCall的时候又会调用到AsyncCall的execute()方法.「ExecutorService是Java多线程的一种使用方式.不懂得可以百度百度…」

下面来看一下AsyncCall的execute()

AsyncCall的execute()

@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 {
      eventListener.callFailed(RealCall.this, e);
      responseCallback.onFailure(RealCall.this, e);
    }
  } finally {
    client.dispatcher().finished(this);
  }
}

​ 一顿分析以后最重要的还是

Response response = getResponseWithInterceptorChain();

​ 最后来看看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, this, eventListener, client.connectTimeoutMillis(),
      client.readTimeoutMillis(), client.writeTimeoutMillis());

  return chain.proceed(originalRequest);
}

getResponseWithInterceptorChain做的事就是把所有配置好的 Interceptor 放在 一个 List 里,然后作为参数,创建⼀个 RealInterceptorChain 对象,并调用 chain.proceed(request) 来发起请求和获取响应。

​ Interceptor的工作原理是什么?是怎么工作的? 下回分解.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值