一、什么是Okhttp,用來干什么
OKHttp是一個網(wǎng)絡(luò)請求框架,一般用來網(wǎng)絡(luò)請求數(shù)據(jù),圖片,文件的上傳下載。
二、請求流程e
當OkHttpClient對象想要發(fā)送一個網(wǎng)絡(luò)請求的時會執(zhí)行newCall()方法這是我們將Request放在這個方法里邊,并調(diào)用enqueue()異步方法調(diào)用這個異步方法會實現(xiàn)Call接口,在源碼里邊,RealCall是Call接口的實現(xiàn)類,也就是說獲取這個異步任務的是ReallCall,ReallCall會把這個異步任務交給他的內(nèi)部類AcycCall ?AcyCall是NamedRunnable的實現(xiàn)類,NamedRunnable實現(xiàn)了Runnanle接口,通俗易懂省的說AcyCall是一個子線程,在AcynCall這個類里邊有一個enqueye()的方法 ?,這時AcynCall 又將任務交給dispatcher去執(zhí)行入隊操作,而且這里還有一個getResponsewithIntertorchan()這個方法是真正拿到響應并且通過接口回調(diào)返回給OkHttpClient對象()
Dispatcher這個類是異步任務調(diào)度器,在這個類里邊有一個不限制線程數(shù)量的一個線程池,也就是說 dispatcher在線程池里邊開啟了一個子線程去執(zhí)行這個異步任務并進行處理,
處理完畢后他會把處理完的數(shù)據(jù)交給getResponsewithIntertorchan()這個方法里邊,是一系列的攔截器,
首先請求會經(jīng)過第一個攔截器,
應用攔截器,當用戶沒有設(shè)置應用攔截器的時候就會跳過這個攔截器,去執(zhí)行RetryAndFollowUpInterceptor
后繼攔截器,后繼攔截器的功能主要是處理重定向和處理失敗重連這兩個操作,
先說他是如何處理重定向,在RetryAndFollowUpInterceptor
后繼攔截器里邊的Interceptor()攔截方法里邊有一個UserResponse類,并從StreamAllocation類里邊獲取連接
然后獲取到當前請求的響應碼,進行一系列的響應碼的Swicth()判斷,判斷如果包含301響應碼的時候,就去執(zhí)行重定向操作,并且構(gòu)造出一個Request(),如果沒有激發(fā)重定向操作會直接返回Response
失敗重連是在StreamAllocaltion里的連接池里邊獲取連接后執(zhí)行的失敗重連操作,重定向和連接超時都只能執(zhí)行20次并拋出異常。
然后進行下一個攔截器BridgeInterceptor橋接攔截器?
橋接攔截器有兩個階段;
請求階段:在請求階段的時候會自動補全當前請求的請求頭,讓當前的請求成為真正可以發(fā)送規(guī)范的Request
響應階段:在響應階段他會進行GZIP操作,GZIP是一種對響應進行加速的處理,服務器通過壓縮,我們通過解壓縮的形式來對響應進行加速
然后執(zhí)行下一個攔截器
CacheInterceptor緩存攔截器
緩存攔截器也分為兩個階段,
請求階段:請求階段對緩存進行判斷,判斷緩存如果有緩存就使用緩存并且返回Response
響應階段:如果沒有緩存通過DiskCache類將響應的數(shù)據(jù)進行緩存
然后執(zhí)行下一個攔截器
ConnectInterceptor ?連接攔截器??
連接攔截器就是打開TCP連接然后執(zhí)行最后一個攔截器
ServiceInterceptor ?執(zhí)行服務攔截器
這個攔截器是真正發(fā)送網(wǎng)絡(luò)請求并且返回Response