okHttp源碼總結(jié)

1.創(chuàng)建OkHttp的時(shí)候 構(gòu)造就會(huì)給我們new Builder()方法


這個(gè)方法中我們創(chuàng)建了一個(gè)Dispatcher分發(fā)器

這個(gè)Dispatcher分發(fā)器會(huì)自動(dòng)創(chuàng)建runningAsyncCalls異步等待對(duì)列

和runningSyncCalls同步等待對(duì)列

2. 創(chuàng)建請(qǐng)求對(duì)象


3.通過(guò)okhttp對(duì)象.newCall(請(qǐng)求對(duì)象) 獲取call對(duì)象

通過(guò)call對(duì)象調(diào)用 同步或者異步 發(fā)起網(wǎng)絡(luò)請(qǐng)求

Call 的實(shí)現(xiàn)類(lèi) RealCall

因?yàn)?Call 是接口,內(nèi)部定義了同步與異步的請(qǐng)求,

以及取消請(qǐng)求等操作,這些操作是由 RealCall 真正去實(shí)現(xiàn)的。

同步:call對(duì)象.execute()


源碼詳解:

通過(guò)OkHttpClient對(duì)象調(diào)用分發(fā)器方法調(diào)用executed()方法

把所有的RealCall對(duì)象(RealCall繼承與Call)添加到同步等待對(duì)列


然后依次執(zhí)行

同時(shí)調(diào)用了getResponseWithInterceptorChain()攔截器方法()

依次執(zhí)行7個(gè)攔截器? 再循環(huán) 返回Response對(duì)象 如果一個(gè)攔截器出錯(cuò)誤

那么就沒(méi)有數(shù)據(jù)


攔截器方法:


獲取數(shù)據(jù):通過(guò)同步對(duì)象.body().string();

.body()從Response.body()中取值

當(dāng)調(diào)用數(shù)據(jù)以后再次調(diào)用會(huì)報(bào)錯(cuò) 因?yàn)槲覀冋{(diào)用一次后

okhttp關(guān)閉讀取流 所有就無(wú)法重復(fù)調(diào)用

異步:?

源碼詳解:

通過(guò)OkHttpClient對(duì)象調(diào)用分發(fā)器方法調(diào)用enqueue(new AsyncCall(接口回調(diào)))方法


RealCal內(nèi)部有executeOn(線程池)方法 execute()處理數(shù)據(jù)? 給responseCallback賦值


當(dāng)我們調(diào)用AsyncCall這個(gè)接口 會(huì)自動(dòng)調(diào)用executeOn方法 同時(shí)接口回調(diào)賦值給我們

client對(duì)象responseCallback 返回給兩個(gè)方法數(shù)據(jù)


當(dāng)調(diào)用數(shù)據(jù)以后再次調(diào)用會(huì)報(bào)錯(cuò) 因?yàn)槲覀冋{(diào)用一次后

okhttp關(guān)閉讀取流 所有就無(wú)法重復(fù)調(diào)用

更多可參考:OKHTTP異步和同步請(qǐng)求簡(jiǎn)單分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容