看該篇文章前首先要熟悉okHttp的使用,建議先讀OkHttp的簡單使用html
本文的源碼解析參考連接:okhttp3總和解析緩存
由異步將請求加入調度方法開始引入正題:併發
getClient().newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } });
/** * Prepares the {@code request} to be executed at some point in the future. */ @Override public Call newCall(Request request) { return new RealCall(this, request); }
@Override public void enqueue(Callback responseCallback) { enqueue(responseCallback, false); } void enqueue(Callback responseCallback, boolean forWebSocket) { synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket)); }
由源碼上的調用順序,咱們將步驟轉化爲如下的幾個技術點:異步
由以上的使用okhttp請求的調用代碼,能夠看到最終的請求時經過dispatcher來完成的。ide
Dispatcher進行線程分發,有兩個方法,一個是普通的單線程,也就是線程阻塞的方式請求;另外一種就是經過隊列進行併發任務的分發和回調,下面主要分析第二種:高併發
就是想到生成一個可緩存的線程池,實現高併發、低阻塞的任務調度。this
攔截器主要用來觀察、修改、以及可能短路的清除輸出、和響應的回來。spa
一般用來添加、移除或者轉換請求或者xiangying的頭部信息。好比將域名替換爲ip地址,將請求頭中添加host屬性,也能夠添加咱們應用中的一些公共參數,好比設備id、版本號等等。線程
http://www.jianshu.com/p/2710ed1e6b48 code