;//執行請求的地方.
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連...