精髓
在OkHttp3中,其靈活性很大程度上體現(xiàn)在,可以攔截其任意一個(gè)環(huán)節(jié),而這個(gè)優(yōu)勢(shì)便是okhttp3整個(gè)請(qǐng)求響應(yīng)架構(gòu)體系的精髓所在:
Okhttp請(qǐng)求流程
在OkHttp3中,每一個(gè)請(qǐng)求任務(wù)都封裝為一個(gè)Call,其實(shí)現(xiàn)為RealCall。
而所有的策略幾乎都可以通過(guò)OkHttpClient傳入
所有全局策略與數(shù)據(jù),除了存儲(chǔ)在允許上層訪問(wèn)的OkHttpClient實(shí)例以外,還有一部分是存儲(chǔ)在只允許包可見(jiàn)的Internal.instance中(如連接池、路由黑名單等)
OkHttp中用戶可傳入的interceptor分為兩類,一類是全局interceptor,該類interceptor在請(qǐng)求開(kāi)始之前最早被調(diào)用,另外一類為非網(wǎng)頁(yè)請(qǐng)求的networkInterceptor,這類interceptor只有在非網(wǎng)頁(yè)請(qǐng)求中會(huì)被調(diào)用,并且是在組裝完成請(qǐng)求之后,真正發(fā)起請(qǐng)求之前被調(diào)用(這塊具體可以參看RealCall#getResponseWithInterceptorChain()方法)
整個(gè)請(qǐng)求過(guò)程通過(guò)RealInterceptorChain#proceed來(lái)連接,在每個(gè)interceptor中調(diào)用下一個(gè)interceptor來(lái)完成整個(gè)請(qǐng)求流程,并且在回到當(dāng)前interceptor后完成響應(yīng)處理
在異步請(qǐng)求中,我們通過(guò)Callback來(lái)獲得簡(jiǎn)單清晰的請(qǐng)求回調(diào)(onFailure、onResponse)
在OkHttpClient中,我們可以傳入EventListener的工廠方法,為每一個(gè)請(qǐng)求創(chuàng)建一個(gè)EventListener,來(lái)接收非常細(xì)的事件回調(diào)
完整interceptor-chain
OkHttp3中的線程池
OkHttp 中的對(duì)所有的任務(wù)采用 NamedRunnable,約束每個(gè)執(zhí)行單元給出對(duì)應(yīng)的業(yè)務(wù)名稱,以便于線程維護(hù)。
1.異步請(qǐng)求線程池-OkHttp Dispatcher
該線程池與Android下的 Executors.newCachedThreadPool() 比較類似;
無(wú)任務(wù)上限,自動(dòng)回收閑置60s的線程,適用于大量耗時(shí)較短的任務(wù);
雖然線程池?zé)o任務(wù)上限,但是Dispatcher對(duì)入口enqueue()進(jìn)行了把關(guān),最大的異步任務(wù)數(shù)默認(rèn)是64,同一個(gè)主機(jī)默認(rèn)是5,當(dāng)然這兩個(gè)默認(rèn)值是可以修改的,Dispatcher提供的修改接口;
通過(guò)兩個(gè)雙端隊(duì)列來(lái)維護(hù)準(zhǔn)備執(zhí)行的任務(wù)和正在執(zhí)行的任務(wù):Deque
在每個(gè)任務(wù)結(jié)束時(shí),都會(huì)檢查 readyAsyncCalls 是否有任務(wù),在條件滿足的情況下,按照先進(jìn)先出的原則將任務(wù)移動(dòng)到 runningAsyncCalls中,并在線程池中執(zhí)行;
異步請(qǐng)求線程池
2.連接池清理線程池-OkHttp ConnectionPool
該線程池用來(lái)清理長(zhǎng)時(shí)間閑置的和泄漏的連接;
該線程池本身無(wú)任務(wù)上限,線程閑置60s自動(dòng)回收;
雖然任務(wù)無(wú)上限,但其通過(guò) cleanupRunning 標(biāo)記來(lái)控制只有一個(gè)線程在運(yùn)行,當(dāng)連接池中沒(méi)有連接后才會(huì)被重新設(shè)置為 false;
次工作線程會(huì)不斷地清理,當(dāng)清理完一遍后超時(shí)連接后,根據(jù)當(dāng)前連接池中最近的下一個(gè)空閑超時(shí)連接計(jì)算出一個(gè)阻塞時(shí)間并阻塞,直到連接池中沒(méi)有任何連接才結(jié)束,并將 cleanupRunning 設(shè)為 false;
在每次有連接加入連接池時(shí),如果當(dāng)前沒(méi)有清理任務(wù)運(yùn)行,會(huì)加入一個(gè)清理任務(wù)到到線程池中執(zhí)行;
連接池清理線程池
3. 緩存整理線程池-OkHttp DiskLruCache
該線程池用于整理本地請(qǐng)求緩存數(shù)據(jù);
緩存的整理包含: 達(dá)到閥值大小的文件,刪除最近最少使用的記錄,在有關(guān)操作達(dá)到一定數(shù)量以后對(duì)記錄進(jìn)行重建;
最大運(yùn)行線程數(shù)1,無(wú)需考慮線程安全問(wèn)題,自動(dòng)回收閑置60s的線程;
4. HTTP2異步事務(wù)線程池-OkHttp Http2Connection
HTTP2采用了多路復(fù)用,因此需要維護(hù)連接有效性,本線程池就是用于維護(hù)相關(guān)的各類HTTP2事務(wù);
線程池本身無(wú)任務(wù)上限,自動(dòng)回收閑置60s的線程;
每一個(gè)HTTP2連接都有這么一個(gè)線程池存在;
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4130瀏覽量
85294 -
HTTP
+關(guān)注
關(guān)注
0文章
481瀏覽量
30778
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論