本文主要分析OkHttp處理Http網(wǎng)絡(luò)請(qǐng)求的整體流程。
下圖是Http最簡(jiǎn)單最核心的示意圖端蛆,HTTP就是從客戶端發(fā)送Http Request(請(qǐng)求)給服務(wù)器刽漂,并接收從服務(wù)器返回的Http Response(響應(yīng))眨层。
而OkHttp就是協(xié)助客戶端(主要是安卓)執(zhí)行Http協(xié)議锁右,發(fā)Http請(qǐng)求,收Http響應(yīng)很魂。但是Http協(xié)議遠(yuǎn)比這要復(fù)雜得多扎酷。
每張圖對(duì)比之前的圖,增加的部分用遏匆。
從攔截器Interceptor開始法挨。
攔截器定義:觀察,修改以及可能短路的請(qǐng)求輸出和響應(yīng)請(qǐng)求的回來幅聘。通常情況下攔截器用來添加凡纳,移除或者轉(zhuǎn)換請(qǐng)求或者回應(yīng)的頭部信息。
整個(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è)線程池。
考慮緩存服務(wù)器
移動(dòng)端的應(yīng)用招狸,所有請(qǐng)求速度越快敬拓,用戶體驗(yàn)越完美。所以緩存在移動(dòng)端對(duì)于用戶體驗(yàn)影響極大裙戏。攔截器將Request發(fā)出是先發(fā)送給本地緩存服務(wù)器乘凸,若本地緩存服務(wù)器擁有有效的緩存,則直接返回Reponse累榜;若沒有营勤,才向服務(wù)器發(fā)Request。
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ì)變與不變分離的原則。
重要接口和實(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ì)模式