OkHttp3原始碼解析(二)OkHttp基本流程

2021-09-20 03:35:54 字數 2681 閱讀 4033

首先使用okhttp發起乙個非同步請求,以此先簡單分析okhttp的大致流程。

okhttp使用:

;okhttp流程主要類 功能

使用建造者模式初始化連線池,dispatcher等,為了節約資源推薦使用單列模式建立okhttpclient物件,維護執行緒池比較耗資源。

http請求所需的url,請求方法等,http請求格式見上一章okhttp3原始碼解析(一)scoket實現http請求。

實現call介面。

1. 同步

直接呼叫realcallexecute()方法。通過***鏈對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 返回所有的...