OkHttp逐步深入

本文主要分析OkHttp處理Http網(wǎng)絡(luò)請(qǐng)求的整體流程。
下圖是Http最簡(jiǎn)單最核心的示意圖端蛆,HTTP就是從客戶端發(fā)送Http Request(請(qǐng)求)給服務(wù)器刽漂,并接收從服務(wù)器返回的Http Response(響應(yīng))眨层。


OkHttp.png

而OkHttp就是協(xié)助客戶端(主要是安卓)執(zhí)行Http協(xié)議锁右,發(fā)Http請(qǐng)求,收Http響應(yīng)很魂。但是Http協(xié)議遠(yuǎn)比這要復(fù)雜得多扎酷。
每張圖對(duì)比之前的圖,增加的部分用\color{blue}{淺藍(lán)}遏匆。

從攔截器Interceptor開始法挨。

攔截器定義:觀察,修改以及可能短路的請(qǐng)求輸出和響應(yīng)請(qǐng)求的回來幅聘。通常情況下攔截器用來添加凡纳,移除或者轉(zhuǎn)換請(qǐng)求或者回應(yīng)的頭部信息。

OkHttp3.png

整個(gè)攔截器鏈包括:應(yīng)用攔截器帝蒿,OkHttp核心荐糜,網(wǎng)絡(luò)攔截器。其中OkHttp核心包括
1陵叽、RetryAndFollowUpInterceptor: 請(qǐng)求重試攔截器
2狞尔、BridgeInterceptor:橋接攔截器
3丛版、CacheInterceptor:緩存攔截器
4巩掺、ConnectInterceptor:連接攔截器
這4個(gè)部分是不可修改的。而
1页畦、ApplicationInterceptor: 應(yīng)用攔截器
2胖替、NetworkInterceptor:網(wǎng)絡(luò)攔截器
可以配置的。
方向上:
Request是從應(yīng)用攔截器走到網(wǎng)絡(luò)攔截器。
Response是從網(wǎng)絡(luò)攔截器走到應(yīng)用攔截器独令。

談?wù)務(wù){(diào)度器Dispatcher

調(diào)度器使Http的收發(fā)支持高并發(fā)端朵。同步調(diào)度直接進(jìn)入攔截器,異步調(diào)度則進(jìn)入調(diào)度器燃箭,等待分配冲呢。調(diào)度器內(nèi)含一個(gè)線程池

OkHttp4.png

考慮緩存服務(wù)器

移動(dòng)端的應(yīng)用招狸,所有請(qǐng)求速度越快敬拓,用戶體驗(yàn)越完美。所以緩存在移動(dòng)端對(duì)于用戶體驗(yàn)影響極大裙戏。攔截器將Request發(fā)出是先發(fā)送給本地緩存服務(wù)器乘凸,若本地緩存服務(wù)器擁有有效的緩存,則直接返回Reponse累榜;若沒有营勤,才向服務(wù)器發(fā)Request。


OkHttp5.png

OkHttp框架常用套路

平時(shí)使用OkHttp框架都是用下面的套路:

// 同步請(qǐng)求
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
                    .url("***")
                    .build();
Response response = client.newCall(request).execute();
// ==========================================================
// 異步請(qǐng)求
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
                    .url("***")
                    .build();

Response response = client.newCall(request).enqueue(new Callback() {
  @Override public void onFailure(Request request, Throwable throwable) {
  }

  @Override public void onResponse(Response response) throws IOException {
  }
});

可以看出來涉及核心類明顯的有:OkHttpClient壹罚、Request 葛作、Response和Call,隱含在其中的有Dispatcher猖凛、Interceptor和Cache进鸠。當(dāng)然,整體流程還得細(xì)節(jié)到HttpCodec形病、Stream客年、Router、Connection等漠吻。最后我們?cè)谥暗贸隽鞒虉D中補(bǔ)充Call類量瓜。

Call類

先談?wù)凜all類的作用。Call是已準(zhǔn)備好要執(zhí)行的請(qǐng)求的接口途乃,RealCall和AsynCall是Call的具體實(shí)現(xiàn)绍傲。Call類讓包裝的的同/異步的get/post指令的Request,擁有了動(dòng)作耍共。Call和Request是同一件事物的內(nèi)容與動(dòng)作的分離烫饼。內(nèi)容會(huì)變;動(dòng)作就是同/異步和get/post指令的排列組合试读,不變杠纵;符合程序設(shè)計(jì)變與不變分離的原則。

OkHttp6.png

重要接口和實(shí)現(xiàn)類總結(jié)

BridgeInterceptor implements Interceptor
CacheInterceptor implements Interceptor
CallServerInterceptor implements Interceptor
ConnectInterceptor implements Interceptor
RetryAndFollowUpInterceptor implements Interceptor
RealInterceptorChain implements Interceptor.Chain
OkHttpClient implements Call.Factory, WebSocketCall.Factory
RealCall implements Call
RealConnection implements Connection
RealWebSocket implements WebSocket
RealWebSocketCall implements WebSocketCall

框架源碼閱讀經(jīng)驗(yàn)之談

第一步:從框架的使用入手钩骇,了解框架源碼主干流程
第二步:將框架從接口和抽象類開始解剖比藻,而后輔以類圖加以組合
第三部:摳細(xì)節(jié)铝量,主要關(guān)注功能和設(shè)計(jì)模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市银亲,隨后出現(xiàn)的幾起案子慢叨,更是在濱河造成了極大的恐慌,老刑警劉巖务蝠,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍谐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馏段,警方通過查閱死者的電腦和手機(jī)赠尾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅弧,“玉大人气嫁,你說我怎么就攤上這事」蛔” “怎么了寸宵?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長元咙。 經(jīng)常有香客問我梯影,道長,這世上最難降的妖魔是什么庶香? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任甲棍,我火速辦了婚禮,結(jié)果婚禮上赶掖,老公的妹妹穿的比我還像新娘感猛。我一直安慰自己,他們只是感情好奢赂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布陪白。 她就那樣靜靜地躺著,像睡著了一般膳灶。 火紅的嫁衣襯著肌膚如雪咱士。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天轧钓,我揣著相機(jī)與錄音序厉,去河邊找鬼。 笑死毕箍,一個(gè)胖子當(dāng)著我的面吹牛弛房,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霉晕,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼庭再,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捞奕!你這毒婦竟也來了牺堰?” 一聲冷哼從身側(cè)響起拄轻,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伟葫,沒想到半個(gè)月后恨搓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筏养,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年斧抱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渐溶。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辉浦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茎辐,到底是詐尸還是另有隱情宪郊,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布拖陆,位于F島的核電站弛槐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏依啰。R本人自食惡果不足惜乎串,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望速警。 院中可真熱鬧叹誉,春花似錦、人聲如沸闷旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠匀。三九已至蕉斜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缀棍,已是汗流浹背宅此。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爬范,地道東北人父腕。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像青瀑,于是被迫代替她去往敵國和親璧亮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萧诫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349