okhttp原始碼解析

2021-09-20 04:39:23 字數 4198 閱讀 6392

okhttp是乙個非常優秀的網路請求框架,已被谷歌加入到android的原始碼中。目前比較流行的retrofit也是預設使用okhttp的。所以okhttp的原始碼是乙個不容錯過的學習資源,學習原始碼之前,務必熟練使用這個框架,否則就是跟自己過不去。

至於為什麼有這麼多優點,各位看官老爺在下面的原始碼解析中慢慢體會吧!

既然是網路框架,那麼先來看看它的post和get請求吧。總的來說,分為三步:

例項化乙個okhttpclient 物件;

構造request請求體;

發請求,同步呼叫okhttpclient.newcall(request).execute();非同步呼叫 okhttpclient.newcall(request).enqueue(new callback())。

.add("name", "張士超")

.add("name", "張士超")

.add("password", "123456")

.build();

request request = new request

.builder()

.url(url)

.post(requestbody)

.build();

try catch (ioexception e)首先我們看看okhttp原始碼涉及到的幾個類的原始碼:

public final class request
進去newrealcall,看看:

static realcall newrealcall(okhttpclient client, request originalrequest, boolean forwebsocket)
總之就是工廠模式將request封裝成乙個realcall物件,接著看okhttpclient.newcall(request).execute(),同步請求;

@override public response execute() throws ioexception 

capturecallstacktrace();

eventlistener.callstart(this);

try catch (ioexception e) finally

}

比較重要的是上面三處注釋:

首先看這個請求有沒有被執行,每個請求只能被執行一次;

若沒有被執行,則將這個請求任務給排程器dispatcher,簡單看看這個排程器做了些什麼:

synchronized void executed(realcall call)
將這個請求加入到runningsynccalls佇列中,後面詳細說說這個排程器。

經過一系列花裡胡哨的***得到響應,這具體後再說怎麼做的。

執行完之後排程器dispatcher結束這個請求任務,看看具體怎麼做的:

void finished(realcall call)
將請求任務從runningsynccalls佇列中移除。

public final class dispatcher 

return executorservice;

}

非同步請求以下面這個為例,看看原始碼都怎麼做的:

}排程執行緒池disptcher實現了高併發,低阻塞的實現

採用deque作為快取,先進先出的順序執行

任務在try/finally中呼叫了finished函式,控制任務佇列的執行順序,而不是採用鎖,減少了編碼複雜性提高效能

response getresponsewithinterceptorchain() throws ioexception 

interceptors.add(new callserverinterceptor(forwebsocket));

interceptor.chain chain = new realinterceptorchain(

interceptors, null, null, null, 0, originalrequest);

return chain.proceed(originalrequest);

}

1)在配置 okhttpclient 時設定的 interceptors;

2)負責失敗重試以及重定向的 retryandfollowupinterceptor;

3)負責把使用者構造的請求轉換為傳送到伺服器的請求、把伺服器返回的響應轉換為使用者友好的響應的 bridgeinterceptor;

4)負責讀取快取直接返回、更新快取的 cacheinterceptor;

5)負責和伺服器建立連線的 connectinterceptor;

6)配置 okhttpclient 時設定的 networkinterceptors;

7)負責向伺服器傳送請求資料、從伺服器讀取響應資料的 callserverinterceptor。

OkHttp原始碼解析

okhttp對外的入口,可以理解為okhttp的平台,其定義了網路協議 dns 請求時間等 網路請求的執行者,enqueue為非同步請求需要傳入okhttpcallback,exexute 為同步請求,直接返回response 網路請求資訊的封裝類,內建url head 請求方式method 請求引...

OkHttp原始碼徹底解析(五)OkHttp連線池

本系列文章 okhttp原始碼徹底解析 一 okhttp請求流程 okhttp原始碼徹底解析 二 okhttp架構及api原始碼 okhttp原始碼徹底解析 三 okhttp3.0 原理 責任鏈模式 okhttp原始碼徹底解析 四 okhttp 的作用 okhttp原始碼徹底解析 五 okhttp連...

OkHttp原始碼解析 一

執行請求的地方.client.newcall request enqueue new callback override public void onresponse call call,response response throws ioexception okhttpclient的newcal...