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...