OkHttp學習筆記(一)

- # okhttp源碼 筆記?

## call.enqueue的時候發(fā)生了什么删铃??

首先要知道該call是由okHttpClient.newCall(request)返回的RealCall

來看一下 call.enqueue的源碼:


? ? public void enqueue(Callback responseCallback) {
?????synchronized (this) {
????????? if (executed) throw new IllegalStateException("Already Executed");? ? ?
? ? ? ? ? executed = true; //如果該請求已經(jīng)發(fā)出,就會拋出一個已經(jīng)存在錯誤
? ? }
? ? ? captureCallStackTrace();//捕捉Call棧
? ? ? eventListener.callStart(this); //通知事件監(jiān)聽,該請求已經(jīng)開始了
? ? ? client.dispatcher().enqueue(new AsyncCall(responseCallback)); //將該請求分發(fā)到隊列中,并且是異步的Call
? ? ?}

### 其中比較難懂的應該是captureCallStackTrace()這個方法潮太,來看一下 它是干什么的

private void captureCallStackTrace() {
? ? ? ?Object callStackTrace = Platform.get().getStackTraceForCloseable("response.body().close()"); //捕獲已經(jīng)被關閉的response 處于的棧
????? ?retryAndFollowUpInterceptor.setCallStackTrace(callStackTrace); //重新請求與重定向的攔截器,設置Call棧的追蹤器挟伙,有了這個追蹤器真竖,該interceptor就可以通過對Call棧內(nèi)不同的情況進行不同處理
? ? }

接著是 client.dispatcher().enqueue(new AsyncCall(responseCallback)); //client將本次連接分發(fā)到相應的連接池中并且異步請求

????dispatcher()之后返回的是一個Dispatcher對象,那么這個對象是干什么的呢详幽?

????**Dispatcher 是一個事件分發(fā)者**筛欢,用于將每個請求放置到請求池以及相應的線程中去**其中OkHttp的并發(fā)最大請求數(shù)量為64個浸锨,最大主機數(shù)量為5個**

????????本節(jié)不討論okhttp的分發(fā)策略,只討論call.enqueue到底做了什么

????????在該請求處于相應的請求池中版姑,隨后執(zhí)行的就是enqueue方法柱搜,

synchronized void enqueue(AsyncCall call) {
? ? ?if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) ????{
? ? ?runningAsyncCalls.add(call);//如果當前的請求數(shù)量與主機數(shù)均未超出最大數(shù)量,就在添加到運行池中
? ? ?executorService().execute(call);//通過**executorService()**執(zhí)行call剥险。
? ? } else {
? ? readyAsyncCalls.add(call);//不然就添加到等待池中
? ? }?
? }

可以從源碼中發(fā)現(xiàn)聪蘸,enqueue()是將本次請求加入到請求隊列中,如果請求數(shù)達到了最大請求數(shù)炒嘲,則將本次請求加入到準備隊列中宇姚,并且通過了一個Service來管理call的生命

**executorService()**

這個服務是用來管理call的,可以shoutdown服務夫凸;或者添加服務但是不執(zhí)行浑劳,在特定的時間執(zhí)行。本次不詳細分析

隨后的就是在enqueue中要傳入的型參**AsyncCal**l

### AsyncCall 則是OkHttp封裝的異步回掉夭拌,用于返回Response

#### 通過 該類中的execute()返回具體的Response下面來看一下該方法的源碼

? ? ? @Override protected void execute() {
? ? ?????????boolean signalledCallback = false; //用于判斷請求是否成功
? ? ? ? try {
? ? ? ????????? Response response = getResponseWithInterceptorChain();
? ? ? ? if (retryAndFollowUpInterceptor.isCanceled()) {
? ? ? ? ? ? ? ? signalledCallback = true;
????????? ? ? ? responseCallback.onFailure(RealCall.this, new IOException("Canceled"));//如果請求成功魔熏,但是服務器解析失敗,并且返回了錯誤code鸽扁,那么就會拋一個錯誤:本次請求取消
? ? ? } else {
????? ? ? ? ?signalledCallback = true;
? ? ?responseCallback.onResponse(RealCall.this, response); //如果請求成功蒜绽,并且code為200,那么就會返回這個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);//事件監(jiān)聽:請求失敗?????
? ? ? ? responseCallback.onFailure(RealCall.this, e);//調(diào)用responseCallback的onFailure方法
? ? ? ? }
? ? ? } finally {
? ? ? client.dispatcher().finished(this);//通知事件分發(fā)器結束本次請求
? ? ? }
? ? ?}
? ? }

所以桶现,call.equeue之后躲雅,Okhttp會捕捉本次request所處于的棧,然后通知事件監(jiān)聽器請求開始骡和,請求開始之后相赁,okhttp的事件分發(fā)器就會將本次請求分發(fā)到相應的線程池中,最后根據(jù)請求結果異步回掉response

如果有錯慰于,希望大家指正Eタ啤!第一次看源碼

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婆赠,一起剝皮案震驚了整個濱河市绵脯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌休里,老刑警劉巖蛆挫,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異份帐,居然都是意外死亡璃吧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門废境,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畜挨,“玉大人筒繁,你說我怎么就攤上這事“驮” “怎么了毡咏?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逮刨。 經(jīng)常有香客問我呕缭,道長,這世上最難降的妖魔是什么修己? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任恢总,我火速辦了婚禮,結果婚禮上睬愤,老公的妹妹穿的比我還像新娘片仿。我一直安慰自己,他們只是感情好尤辱,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布砂豌。 她就那樣靜靜地躺著,像睡著了一般光督。 火紅的嫁衣襯著肌膚如雪阳距。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天结借,我揣著相機與錄音筐摘,去河邊找鬼。 笑死船老,一個胖子當著我的面吹牛蓄拣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播努隙,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辜昵!你這毒婦竟也來了荸镊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堪置,失蹤者是張志新(化名)和其女友劉穎躬存,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舀锨,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡岭洲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坎匿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盾剩。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雷激,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出告私,到底是詐尸還是另有隱情屎暇,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布驻粟,位于F島的核電站根悼,受9級特大地震影響,放射性物質發(fā)生泄漏蜀撑。R本人自食惡果不足惜挤巡,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酷麦。 院中可真熱鬧矿卑,春花似錦、人聲如沸贴铜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍坝。三九已至徘意,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轩褐,已是汗流浹背椎咧。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留把介,地道東北人勤讽。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像拗踢,于是被迫代替她去往敵國和親脚牍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容