OKHttp學(xué)習(xí)筆記(一)

第一次寫博客,說是博客卑笨,其實就是自己的學(xué)習(xí)筆記茧泪,希望能堅持下去!


OKHttp的簡單請求示例:


OkHttpClient.Builder builder =new OkHttpClient.Builder();

OkHttpClient client = builder.build();

Request request =new Request.Builder()

  .url("")

  .build();

try {

    // 同步請求

    client.newCall(request).execute();

    // 異步請求

    client.newCall(request).enqueue(new Callback() {

        @Override

        public void onFailure(Call call, IOException e) {

}

        @Override

        public void onResponse(Call call, Response response)throws IOException {

}

});

} catch (IOException e) {

  e.printStackTrace();

}

以下是自己做的請求順序?qū)D:

請求順序

結(jié)合圖總結(jié)一下異步請求過程

  • 如果滿足異步執(zhí)行條件圆恤,則入隊并立即執(zhí)行突倍,否則,加入ready隊列哑了,等待合適的條件去將其取出赘方;當(dāng)一個請求執(zhí)行結(jié)束,會調(diào)用Dispatcher的promoteCalls方法弱左,會將ready隊列中的AsyncCall取出窄陡,入隊并開始執(zhí)行,然后在線程池中調(diào)用所執(zhí)行的Call的getResponseWithInterceptorChain()拆火,獲取到請求結(jié)果跳夭,并回調(diào)出去。
  • 同步異步的執(zhí)行區(qū)別:都是調(diào)用的getResponseWithInterceptorChain()方法们镜,異步線程是通過線程池來執(zhí)行的币叹,而同步則是直接執(zhí)行

Dispatcher類

1. 線程池
該類中,獲取線程池的方法為executorService()模狭,該方法內(nèi)部實現(xiàn)的是懶加載的無邊界限制的線程池颈抚。

if (executorService == null) {
      executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
          new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}

可見,OKHttp中使用的線程池是ThreadPoolExecutor
參數(shù)說明:

  • 0:核心線程數(shù)量嚼鹉,0表示后臺線程空閑后不會保留贩汉,經(jīng)過一段時間后停止
  • Integer.MAX_VALUE:線程池可容納的最大線程數(shù)量
  • TimeUnit.SECOND:線程池中的線程數(shù)量大于核心線程數(shù)量時驱富,空閑線程等待60s即被終止,若小于匹舞,則立即終止
  • new SynchronousQueue<Runnable>():線程等待隊列
  • 最后一個參數(shù):線程工廠
    這里褐鸥,需要對SynchronousQueue進(jìn)行說明:
    該隊列的特點(diǎn)是:每插入一個元素必須等待另一個元素的移除,每移除一個元素都會等待另一個元素的插入赐稽,也就是說叫榕,該隊列內(nèi)部其實沒有元素,容量為0姊舵;這樣設(shè)計的意義就是可以快速的傳遞元素晰绎,很適合高頻率的請求處理。

2. 結(jié)束請求finished方法

  • 先移除該call對象
  • 根據(jù)傳入的promoteCalls參數(shù)蠢莺,確定是否調(diào)用promoteCalls()方法寒匙;若為同步請求,則該參數(shù)為false躏将,若為異步請求锄弱,則參數(shù)為true,需要執(zhí)行下一步的入隊操作

3. promoteCalls()方法
該方法是操作隊列祸憋,控制請求執(zhí)行的關(guān)鍵会宪,負(fù)責(zé)將ready隊列的call轉(zhuǎn)化為running狀態(tài)

  • 首先,它會判斷當(dāng)前執(zhí)行的request是否大于64
  • 若小于蚯窥,則遍歷ready隊列掸鹅,取出call并將其添加進(jìn)running隊列,調(diào)用線程池的execute(call)方法
  • 遍歷的終止條件:ready隊列為空拦赠,或者running滿足最大數(shù)量限制
    回調(diào)該方法有三個時機(jī):
  • 一個請求執(zhí)行結(jié)束巍沙,finished方法中
  • Dispatcher的setMaxRequestsPerHost()被調(diào)用
  • Dispatcher的setMaxRequests()被調(diào)用

總結(jié)
該類控制著異步請求時的任務(wù)調(diào)度和線程池,并未直接負(fù)責(zé)請求的執(zhí)行荷鼠,配合線程池句携,實現(xiàn)了高并發(fā),低阻塞的運(yùn)行允乐。


參考:這位大佬的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矮嫉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牍疏,更是在濱河造成了極大的恐慌蠢笋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞陨,死亡現(xiàn)場離奇詭異昨寞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門编矾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熟史,“玉大人馁害,你說我怎么就攤上這事窄俏。” “怎么了碘菜?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵凹蜈,是天一觀的道長。 經(jīng)常有香客問我忍啸,道長仰坦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任计雌,我火速辦了婚禮悄晃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凿滤。我一直安慰自己妈橄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布翁脆。 她就那樣靜靜地躺著眷蚓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪反番。 梳的紋絲不亂的頭發(fā)上沙热,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音罢缸,去河邊找鬼篙贸。 笑死,一個胖子當(dāng)著我的面吹牛枫疆,可吹牛的內(nèi)容都是我干的爵川。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼养铸,長吁一口氣:“原來是場噩夢啊……” “哼雁芙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钞螟,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兔甘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鳞滨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞焙,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澡匪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熔任。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唁情,靈堂內(nèi)的尸體忽然破棺而出疑苔,到底是詐尸還是另有隱情,我是刑警寧澤甸鸟,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布惦费,位于F島的核電站,受9級特大地震影響抢韭,放射性物質(zhì)發(fā)生泄漏薪贫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一刻恭、第九天 我趴在偏房一處隱蔽的房頂上張望瞧省。 院中可真熱鬧,春花似錦鳍贾、人聲如沸鞍匾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽候学。三九已至,卻和暖如春纵散,著一層夾襖步出監(jiān)牢的瞬間梳码,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工伍掀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掰茶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓蜜笤,卻偏偏與公主長得像濒蒋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子把兔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,183評論 25 707
  • - # okhttp源碼 筆記 ## call.enqueue的時候發(fā)生了什么沪伙? 首先要知道該call是由okHt...
    帶帶太師兄閱讀 406評論 0 1
  • 截至目前,共四期節(jié)目县好,分析如下: 訂閱數(shù):6 播放數(shù):216 各期播放量(按照倒序):以色列38围橡,新西蘭53,葡萄...
    OnTheRoad8閱讀 200評論 0 0
  • 日落的陽光 溫柔得像一個老情人 輕撫著天邊 深吻著大地 別離的淚水 流淌成無盡的大海 黃昏很曖昧 可能是少女嬌媚一...
    拾肆十四14閱讀 216評論 2 2
  • 一缕贡、配置項 連接池池在連接增長很快的情況下翁授,c3p0提供了幾種加快revert 到池最小size(minPoolS...
    Mooner_guo閱讀 1,975評論 0 0