OkHttp原始碼解析 一

2021-08-29 20:41:18 字數 3493 閱讀 5048

;//執行請求的地方.

client.

newcall

(request)

.enqueue

(new

callback()

@override

public

void

onresponse

(call call, response response)

throws ioexception })

;​ okhttpclient的newcall(request request)方法通過呼叫realcall的靜態方法newrealcall來建立乙個用於請求的realcall

@override

public call newcall

(request request)

​ realcall是執行請求的類,關鍵方法有execute()enqueue()

dispatcher是排程器,內部管理執行緒.

//realcall的execute()方法

//關鍵**

@override

public response execute()

throws ioexception

realcall的execute()這是乙個同步請求的方法,在方法內部呼叫了dispatcher的execute()方法

//dispatcher的execute()方法.  

//在同步呼叫的佇列裡新增乙個realcall

synchronized

void

executed

(realcall call)

​ dispatcher的executed(realcall call)方法只做了乙個向同步呼叫的佇列裡新增乙個realcall的操作.最關鍵的方法是在

response result = getresponsewithinterceptorchain();

​ 下面來看看realcall的enqueue()方法

​ 這是乙個非同步請求的方法

//realcall的enqueue()方法

//關鍵**

@override

public

void

enqueue

(callback responsecallback)

下面來看看dispatcher的enqueue(asynccall call)方法

//dispatcher的enqueue(asynccall call)

synchronized

void

enqueue

(asynccall call)

else

}

​ dispatcher的enqueue(asynccall call)對請求佇列進行了一些判斷,來判斷是直接執行call還是將call加入readyasynccalls(已經執行非同步請求的對列).

​ 然後再來看看 dispatcher的executorservice()方法.

public

synchronized executorservice executorservice()

return executorservice;

}

executorservice()方法做的就是建立乙個executorservice.然後在回過來看dispatcher的enqueue()方法

synchronized

void

enqueue

(asynccall call)

dispatcher的enqueue(asynccall call)方法做的最主要的就是用executorservice執行asynccall,

下面來看一下asynccall的execute()

@override

protected

void

execute()

else

}catch

(ioexception e)

else

}finally

}

​ 一頓分析以後最重要的還是

response response = getresponsewithinterceptorchain();

​ 最後來看看getresponsewithinterceptorchain()

response getresponsewithinterceptorchain()

throws ioexception

interceptors.

add(

newcallserverinterceptor

(forwebsocket));

interceptor.chain chain =

newrealinterceptorchain

(interceptors, null, null, null,0,

originalrequest,

this

, eventlistener, client.

connecttimeoutmillis()

, client.

readtimeoutmillis()

, client.

writetimeoutmillis()

);return chain.

proceed

(originalrequest)

;}

getresponsewithinterceptorchain做的事就是把所有配置好的 interceptor 放在 乙個 list 里,然後作為引數,建立⼀個 realinterceptorchain 物件,並呼叫 chain.proceed(request) 來發起請求和獲取響應。

​ interceptor的工作原理是什麼?是怎麼工作的? 下回分解.

OkHttp原始碼解析

okhttp對外的入口,可以理解為okhttp的平台,其定義了網路協議 dns 請求時間等 網路請求的執行者,enqueue為非同步請求需要傳入okhttpcallback,exexute 為同步請求,直接返回response 網路請求資訊的封裝類,內建url head 請求方式method 請求引...

okhttp原始碼解析

okhttp是乙個非常優秀的網路請求框架,已被谷歌加入到android的原始碼中。目前比較流行的retrofit也是預設使用okhttp的。所以okhttp的原始碼是乙個不容錯過的學習資源,學習原始碼之前,務必熟練使用這個框架,否則就是跟自己過不去。至於為什麼有這麼多優點,各位看官老爺在下面的原始碼...

OkHttp原始碼徹底解析(五)OkHttp連線池

本系列文章 okhttp原始碼徹底解析 一 okhttp請求流程 okhttp原始碼徹底解析 二 okhttp架構及api原始碼 okhttp原始碼徹底解析 三 okhttp3.0 原理 責任鏈模式 okhttp原始碼徹底解析 四 okhttp 的作用 okhttp原始碼徹底解析 五 okhttp連...