okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程
1.簡單使用
同步:@Override public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
try {
client.dispatcher().executed(this);
Response result = getResponseWithInterceptorChain(false);
if (result == null) throw new IOException("Canceled");
return result;
} finally {
client.dispatcher().finished(this);
}
}
首先加鎖置標(biāo)志位,接著使用分配器的executed方法將call加入到同步隊列中,然后調(diào)用getResponseWithInterceptorChain方法(稍后分析)執(zhí)行http請求,最后調(diào)用finishied方法將call從同步隊列中刪除
異步:1. void enqueue(Callback responseCallback, boolean forWebSocket) {
2. synchronized (this) {
3. if (executed) throw new IllegalStateException("Already Executed");
4. executed = true;
5. }
6. client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket));
7. }
同樣先置標(biāo)志位,然后將封裝的一個執(zhí)行體放到異步執(zhí)行隊列中。這里面引入了一個新的類AsyncCall,這個類繼承于NamedRunnable,實現(xiàn)了Runnable接口。NamedRunnable可以給當(dāng)前的線程設(shè)置名字,并且用模板方法將線程的執(zhí)行體放到了execute方法中
2.總體架構(gòu)
上圖是OkHttp的總體架構(gòu),大致可以分為以下幾層:Interface——接口層:接受網(wǎng)絡(luò)訪問請求
Protocol——協(xié)議層:處理協(xié)議邏輯
Connection——連接層:管理網(wǎng)絡(luò)連接,發(fā)送新的請求,接收服務(wù)器訪問
Cache——緩存層:管理本地緩存
I/O——I/O層:實際數(shù)據(jù)讀寫實現(xiàn)
Inteceptor——攔截器層:攔截網(wǎng)絡(luò)訪問,插入攔截邏輯
①Interface——接口層:
接口層接收用戶的網(wǎng)絡(luò)訪問請求(同步請求/異步請求),發(fā)起實際的網(wǎng)絡(luò)訪問。OkHttpClient是OkHttp框架的客戶端,更確切的說是一個用戶面板。用戶使用OkHttp進(jìn)行各種設(shè)置,發(fā)起各種網(wǎng)絡(luò)請求都是通過OkHttpClient完成的。每個OkHttpClient內(nèi)部都維護(hù)了屬于自己的任務(wù)隊列,連接池,Cache,攔截器等,所以在使用OkHttp作為網(wǎng)絡(luò)框架時應(yīng)該全局共享一個OkHttpClient實例。
Call描述一個實際的訪問請求,用戶的每一個網(wǎng)絡(luò)請求都是一個Call實例。Call本身只是一個接口,定義了Call的接口方法,實際執(zhí)行過程中,OkHttp會為每一個請求創(chuàng)建一個RealCall,每一個RealCall內(nèi)部有一個AsyncCall,AsyncCall繼承的NamedRunnable繼承自Runnable接口。
所以每一個Call就是一個線程,而執(zhí)行Call的過程就是執(zhí)行其execute方法的過程。
Dispatcher是OkHttp的任務(wù)隊列,其內(nèi)部維護(hù)了一個線程池,當(dāng)有接收到一個Call時,Dispatcher負(fù)責(zé)在線程池中找到空閑的線程并執(zhí)行其execute方法。這部分將會單獨拿一篇博客進(jìn)行介紹,詳細(xì)內(nèi)容可參考本系列接下來的文章。
②.Protocol——協(xié)議層:處理協(xié)議邏輯
Protocol層負(fù)責(zé)處理協(xié)議邏輯,OkHttp支持Http1/Http2/WebSocket協(xié)議,并在3.7版本中放棄了對Spdy協(xié)議,鼓勵開發(fā)者使用Http/2。
③.Connection——連接層:管理網(wǎng)絡(luò)連接,發(fā)送新的請求,接收服務(wù)器訪問
連接層顧名思義就是負(fù)責(zé)網(wǎng)絡(luò)連接。在連接層中有一個連接池,統(tǒng)一管理所有的Socket連接,當(dāng)用戶新發(fā)起一個網(wǎng)絡(luò)請求時,OkHttp會首先從連接池中查找是否有符合要求的連接,如果有則直接通過該連接發(fā)送網(wǎng)絡(luò)請求;否則新創(chuàng)建一個網(wǎng)絡(luò)連接。
RealConnection描述一個物理Socket連接,連接池中維護(hù)多個RealConnection實例。由于Http/2支持多路復(fù)用,一個RealConnection可以支持多個網(wǎng)絡(luò)訪問請求,所以O(shè)kHttp又引入了StreamAllocation來描述一個實際的網(wǎng)絡(luò)請求開銷(從邏輯上一個Stream對應(yīng)一個Call,但在實際網(wǎng)絡(luò)請求過程中一個Call常常涉及到多次請求。如重定向,Authenticate等場景。所以準(zhǔn)確地說,一個Stream對應(yīng)一次請求,而一個Call對應(yīng)一組有邏輯關(guān)聯(lián)的Stream),一個RealConnection對應(yīng)一個或多個StreamAllocation,所以StreamAllocation可以看做是RealConenction的計數(shù)器,當(dāng)RealConnection的引用計數(shù)變?yōu)?,且長時間沒有被其他請求重新占用就將被釋放。
連接層是OkHttp的核心部分,這部分當(dāng)然也會單獨拿一篇博客詳細(xì)講解,詳細(xì)內(nèi)容可參考本專題相關(guān)文章。
④.Cache——緩存層:管理本地緩存
Cache層負(fù)責(zé)維護(hù)請求緩存,當(dāng)用戶的網(wǎng)絡(luò)請求在本地已有符合要求的緩存時,OkHttp會直接從緩存中返回結(jié)果,從而節(jié)省網(wǎng)絡(luò)開銷。這部分內(nèi)容也會單獨拿一篇博客進(jìn)行介紹,詳細(xì)內(nèi)容可參考本專題相關(guān)文章。
⑤.I/O——I/O層:實際數(shù)據(jù)讀寫實現(xiàn)
I/O層負(fù)責(zé)實際的數(shù)據(jù)讀寫。OkHttp的另一大有點就是其高效的I/O操作,這歸因于其高效的I/O庫okio
這部分內(nèi)容筆者也打算另開一個專題進(jìn)行介紹。詳細(xì)內(nèi)容可以參考本博客相關(guān)內(nèi)容。
⑥Inteceptor——攔截器層:攔截網(wǎng)絡(luò)訪問,插入攔截邏輯
攔截器層提供了一個類AOP接口,方便用戶可以切入到各個層面對網(wǎng)絡(luò)訪問進(jìn)行攔截并執(zhí)行相關(guān)邏輯。
原文鏈接:https://www.bbsmax.com/A/kPzOg9lQzx/
總結(jié)
以上是生活随笔為你收集整理的okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python提取网页中p标签中的内容_使
- 下一篇: PLSQL中INDEX BY TABLE