okhttp源碼分析

android開發(fā)中大部分的網(wǎng)絡(luò)框架都用到了okhttp,okhttp既HTTP框架缨叫,今天通過代碼理清一下okhttp的運行思路着降,先看一段代碼

String url = "http://www.baidu.com";

?OkHttpClient client = new OkHttpClient();

?new OkHttpClient().newBuilder();

?Request request = new Request.Builder()

?.url(url)

? .get()? //默認(rèn)為GET請求硝枉,可以不寫

? .build();

? final Call call = client.newCall(request);

? ? ? ? try {

? ? ? ? ? ? call.execute();? ? ? //同步

? ? ? ? ? ? call.enqueue(new Callback() {? //異步

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onFailure(Call call, IOException e) {

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void onResponse(Call call, Response response) throws IOException {

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? ? ? call.cancel();

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

這里先看OkHttpClient client = new OkHttpClient();中的OkHttpClient

第一步就是創(chuàng)建okhttpclient對象

第二步創(chuàng)建請求對象

Request request = new Request.Builder()

?.url(url)

? .get()? //默認(rèn)為GET請求烁登,可以不寫

? .build();


經(jīng)過這幾步完成了request的數(shù)據(jù)賦值

ok,現(xiàn)在要進行網(wǎng)絡(luò)請求

?final Call call = client.newCall(request);

網(wǎng)絡(luò)請求分同步和異步兩種

同步?call.execute();

先看client.dispatcher().executed(this);

executed執(zhí)行的時候會把call回調(diào)對象裝到runningSyncCalls集合中

/** Running synchronous calls. Includes canceled calls that haven't finished yet. */

private final DequerunningSyncCalls =new ArrayDeque<>();

異步call.enqueue(new Callback() {//異步

? ? ? ? ? @Override

? ? ? ? ? public void onFailure(Call call, IOException e) {

? ? ? ? ? ?}

? ? ? ? ?@Override

? ? ? ? ?public void onResponse(Call call, Response response)throws IOException {

}

});

這里的AsncCall是異步線程粮宛,在子線程中執(zhí)行網(wǎng)絡(luò)操作烹玉,獲取到的結(jié)果會通過responseCallback回調(diào)到主線程中

攔截器是 OkHttp 提供的對 Http 請求和響應(yīng)進行統(tǒng)一處理的強大機制,它可以實現(xiàn)網(wǎng)絡(luò)監(jiān)聽钞馁、請求以及響應(yīng)重寫虑省、請求失敗充實等功能

chain.proceed():方法是 Http 開始工作的地方匿刮,就是由它產(chǎn)生了與請求相對應(yīng)的響應(yīng)。

攔截器的分類:Application Interceptor(應(yīng)用攔截器)和?NetWork Interceptor(網(wǎng)絡(luò)攔截器)

? ?1.應(yīng)用攔截器

? ? (1)不能操作中間的響應(yīng)結(jié)果探颈,比如重定向和重試熟丸,只能操作客戶端主動的第一次請求以及最終的響應(yīng)結(jié)果。

? ? (2)始終調(diào)用一次膝擂,即使Http響應(yīng)是從緩存中提供的虑啤。

? ? (3)關(guān)注原始的request,而不關(guān)心注入的headers架馋,比如If-None-Match狞山。

? ? (4)允許短路 short-circuit ,并且不調(diào)用 chain.proceed()叉寂。(注:這句話的意思是Chain.proceed()不需要一定要獲取來自服務(wù)器的響應(yīng)萍启,但是必須還是需要返回Respond實例。那么實例從哪里來屏鳍?答案是緩存勘纯。如果本地有緩存,可以從本地緩存中獲取響應(yīng)實例返回給客戶端钓瞭。這就是short-circuit (短路)的意思)

? ? (5)允許請求失敗重試驳遵,并多次調(diào)用 chain.proceed();

? 2.網(wǎng)絡(luò)攔截器

? ? (1)能夠?qū)χ囟ㄏ蚝椭卦嚨戎虚g響應(yīng)進行操作

? ? (2)不允許調(diào)用緩存來short-circuit (短路)這個請求。(注:意思就是說不能從緩存池中獲取緩存對象返回給客戶端山涡,必須通過請求服務(wù)的方式獲取響應(yīng)堤结,也就是Chain.proceed())

? ? (3)觀察網(wǎng)絡(luò)傳輸中數(shù)據(jù)傳輸和變化(注:比如當(dāng)發(fā)生了重定向時,我們就能通過網(wǎng)絡(luò)攔截器來確定存在重定向的情況)

? ? (4)可以獲取 Connection 攜帶的請求信息(即可以通過chain.connection() 獲取非空對象)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸭丛,一起剝皮案震驚了整個濱河市竞穷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳞溉,老刑警劉巖瘾带,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熟菲,居然都是意外死亡看政,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門抄罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帽衙,“玉大人,你說我怎么就攤上這事贞绵。” “怎么了恍飘?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵榨崩,是天一觀的道長谴垫。 經(jīng)常有香客問我,道長母蛛,這世上最難降的妖魔是什么翩剪? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮彩郊,結(jié)果婚禮上前弯,老公的妹妹穿的比我還像新娘。我一直安慰自己秫逝,他們只是感情好恕出,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著违帆,像睡著了一般浙巫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刷后,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天的畴,我揣著相機與錄音,去河邊找鬼尝胆。 笑死丧裁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的含衔。 我是一名探鬼主播煎娇,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抱慌!你這毒婦竟也來了逊桦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抑进,失蹤者是張志新(化名)和其女友劉穎强经,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寺渗,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡匿情,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了信殊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬称。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涡拘,靈堂內(nèi)的尸體忽然破棺而出玲躯,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布跷车,位于F島的核電站棘利,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朽缴。R本人自食惡果不足惜善玫,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望密强。 院中可真熱鬧茅郎,春花似錦、人聲如沸或渤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳坑。三九已至毕谴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間距芬,已是汗流浹背涝开。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留框仔,地道東北人舀武。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像离斩,于是被迫代替她去往敵國和親银舱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 那么我今天給大家簡單地講一下Okhttp這款網(wǎng)絡(luò)框架及其原理跛梗。它是如何請求數(shù)據(jù)寻馏,如何響應(yīng)數(shù)據(jù)的 有什么優(yōu)點?它的應(yīng)...
    卓而不群_0137閱讀 312評論 0 1
  • 因為項目集成核偿,在使用Fresco的時候诚欠,有集成OkHttp,所以接下來是OkHttp3.0的 簡單一個列子漾岳,其中里...
    TragedyGo閱讀 1,347評論 0 1
  • OkHttp作為時下最受歡迎的網(wǎng)絡(luò)請求框架之一轰绵,它有著自己的優(yōu)點: 使用了眾多的設(shè)計模式(如:Builder模式、...
    永恒之眼V閱讀 274評論 1 1
  • 基本使用 異步GET Request.Builder builder = new Request.Builder(...
    銳_nmpoi閱讀 138評論 0 0
  • OkHttp源碼分析 在現(xiàn)在的Android開發(fā)中尼荆,請求網(wǎng)絡(luò)獲取數(shù)據(jù)基本上成了我們的標(biāo)配左腔。在早期的Android開...
    BlackFlag閱讀 323評論 0 5