首先使用okhttp發起乙個非同步請求,以此先簡單分析okhttp的大致流程。
okhttp使用:
;okhttp流程主要類 功能
使用建造者模式初始化連線池,dispatcher等,為了節約資源推薦使用單列模式建立okhttpclient物件,維護執行緒池比較耗資源。
http請求所需的url,請求方法等,http請求格式見上一章okhttp3原始碼解析(一)scoket實現http請求。
實現call介面。
1. 同步
直接呼叫realcall
的execute()
方法。通過***鏈對request進行封裝,發起請求,對得到的response進行封裝,最後返回。***鏈下章講。
2. 非同步
呼叫enqueue()
,最後會用呼叫dispatcher的enqueue()
。傳入的是乙個runable的子類asynccall(realcall內部類)
@override
public
void
enqueue
(callback responsecallback)
transmitter.
callstart()
;//呼叫dispatcher的enqueue方法
client.
dispatcher()
.enqueue
(new
asynccall
(responsecallback));
}
包含執行緒池
public
synchronized executorservice executorservice()
return executorservice;
}
經過realcallenqueue()
,來到了最後的dispatcher的enqueue()
void
enqueue
(asynccall call)
}promoteandexecute()
;}
後面執行promoteandexecute();
遍歷等待請求序列。
判斷正在執行的請求數是否,小於64,並且同時請求的主機數小於5,不滿足條件,直接break停止當前遍歷。
符合判斷,則將當前等待執行請求加入臨時可以執行序列executablecalls
,並且將當前請求新增到正在請求序列。繼續遍歷,知道遍歷完所有等待請求序列或者是正在執行序列,主機數超過上限。
遍歷可以執行序列,放入執行緒池執行請求。
private
boolean
promoteandexecute()
isrunning =
runningcallscount()
>0;
}//可以執行list中有任務,放入執行緒池執行。
for(
int i =
0, size = executablecalls.
size()
; i < size; i++
)return isrunning;
}
namedrunnable
實現runable介面,幷包含抽象方法execute
。並在run方法中執行execute()
namedrunnable主要**。
@override
public
void
run(
)abstract
void
exexute()
;
realcall內部類,繼承抽象類namedrunnable,
實現抽象方法execute()
,當dispatcher呼叫執行緒池執行請求,最終會到asynccall的execute()
。通過***鏈處理得到response,下章講。
@override
protected
void
execute()
catch
(ioexception e)
finally
}
OkHttp3原始碼解析
compile com.squareup.okhttp3 okhttp 3.6.0 最新版本 okhttp的最底層是使用socket,而不是urlconnection,它通過platform的class.forname 反射獲得當前runtime使用的socket庫。okhttp3使用場景特點 資料...
Okhttp3原始碼完全解析
上文已經說了,okhttp和retrofit是相輔相成的,retrofit是對okhttp的上層封裝,okhttp是http的底層實現。那麼,今天就來解析一下okhttp的原始碼。okhttp的使用如下,我們能夠看到,先是new了乙個okhttpclient,然後這個okhttpclient又new...
OkHttp3原始碼(二) Request
request 是對http請求報文概念的具體實現 請求報文的結構圖 根據結構圖去閱讀原始碼能很好的理解某些屬性的真實意義。我們看一下原始碼。public final class request 返回設定的url 返回設定的方法 get或post public string method 返回所有的...