首先我們來看一段**:
});我們直接來看這一段
研究okhttpclient這個類之前,我們先來看看他都實現了那些類。
}
這裡我們就很明白newcall 的來歷了。廢話不多說直接看okhttpclient的newcall方法。
public class okhttpclient implements cloneable, call.factory, websocket.factory
}
然後進入realcall:
static realcall newrealcall(okhttpclient client, request originalrequest, boolean forwebsocket)
private realcall(okhttpclient client, request originalrequest, boolean forwebsocket)
這裡我們看到比較重要的乙個類retryandfollowupinterceptor。重試/重定向 ***。這裡我們不多做解析,後面的章節我們會詳細的分析。
接下來就是
call.enqueue(new callback()
@override
public void onresponse(call call, response response) throws ioexception
});
從上面的分析我們知道,這裡的call 是realcall,so...我們去看一下他的enqueue方法。(當然這裡我們也看見了realcall也是實現的call介面)。
@override public void enqueue(callback responsecallback)
...client.dispatcher().enqueue(new asynccall(responsecallback));
}
乙個同步鎖是否執行過的判斷。然後我們來看一下這段**:client.dispatcher().enqueue(new asynccall(responsecallback));
這樣,我們需求進入到okhttpclient中,
}接著,我們來看看dispatcher。
public final class dispatcher
... public synchronized executorservice executorservice()
return executorservice;
} synchronized void enqueue(asynccall call) else
} private void promotecalls()
if (runningasynccalls.size() >= maxrequests) return; // reached max capacity.
}} synchronized void executed(realcall call)
private void finished(dequecalls, t call, boolean promotecalls)
if (runningcallscount == 0 && idlecallback != null)
}}
好吧有點多,我們來看看都是啥,首先dispatcher是乙個排程器maxrequests最大請求為64,maxrequestsperhost每個主機最多請求數為5。
public synchronized executorservice executorservice()
return executorservice;
}
生成了乙個可以無限大的 存活週期60s的執行緒池。
private final dequereadyasynccalls = new arraydeque<>();
private final dequerunningasynccalls = new arraydeque<>();
private final dequerunningsynccalls = new arraydeque<>();
三個佇列,乙個同步請求的佇列runningsynccalls,兩個非同步請求使用的佇列(readyasynccalls為等待請求的佇列,runningasynccalls為正在請求的佇列)。
好了繼續enqueue方法,很明顯,我們要先看一下asynccall。
final class asynccall extends namedrunnable
... @override protected void execute() else
} catch (ioexception e) else
} finally
}}
這是乙個可以命名的執行緒。最重要的方法execute。因為設計到okhttpclient的攔截機制,我們後面會詳細分析。
現在我們終於來到了
client.dispatcher().enqueue(new asynccall(responsecallback));我們進入到dispatcher可知:
synchronized void enqueue(asynccall call) else
}
如果runningasynccalls大小小於64,這個介面主機請求小於5 ,這時就會把call 新增到正在請求的佇列中,並且通過executorservice的排程執行asynccall的execute方法,最終通過 response response = getresponsewithinterceptorchain(); 獲取到response通過callback返回。 OkHttp 原始碼分析
先來看 new okhttpclient 然後 clien.newcall request 建立了 realcall 物件,這也是 okhttp 中乙個重要的類,先來分析非同步執行的原始碼吧,因為同步執行跟非同步的後半段沒什麼區別了。override public void enqueue call...
OkHttp原始碼分析(四)DiskLruCache
前一章講到okhttp使用的快取是disklrucache,displrucache是以linkedhashmap為底層實現的磁碟快取,但是具體是如何快取的我還是不是很理解,作為程式設計師,不理解和鹹魚有什麼分別。為了不做鹹魚,我們還是看一下原始碼吧!public final class diskl...
OkHttp原始碼解析 一
執行請求的地方.client.newcall request enqueue new callback override public void onresponse call call,response response throws ioexception okhttpclient的newcal...