Volley原始碼分析 請求處理

2021-08-15 03:59:03 字數 2009 閱讀 1354

總結

本篇分析分析volley如何生成請求,如何處理請求,以及請求如何返回。從分析中學習再做元件時如何處理請求。

生產者-消費者模型描述的是共享的緩衝區的兩類執行緒,一類是新增訊息的生產者,一類是處理訊息的消費者。而基本涉及到的多執行緒處理的均使用這個模型。比如glide,比如這邊文件分析的volley,比如okhttp,再比如jdk中的threadpoolexecutor。

根據配置requestqueue的start方法會啟動相應的執行緒來分發處理請求。

public

void

start()

}

啟動乙個cachedispatcher,cachedispatcher用於處理是否請求命中快取直接返回。一方面cachedispatcher是消費者,處理mcachequeue的請求。一方面cachedispatcher是生產者,對於未命中快取直接新增到mnetworkqueue中。

啟動networkdispatcher,根據配置的執行緒數來啟動網路請求的執行緒。networkdispatcher作為mnetworkqueue的消費者,不斷從mnetworkqueue獲取請求進行處理。

client的**通過requestqueue的add方法新增請求,如果設定了不保留快取,將直接的新增到mnetworkqueue中。如果設定了,新增到mnetworkqueue中。

public

requestadd(requestrequest)

// process requests in the order they are added.

request.setsequence(getsequencenumber());

request.addmarker("add-to-queue");

// if the request is uncacheable, skip the cache queue and go straight to the network.

if (!request.shouldcache())

mcachequeue.add(request);

return request;

}

快取請求處理

在cachedispatcher的run()方法中一直是迴圈處理請求。而在processrequest方法中

從快取佇列中或者請求

命中快取直接返回

沒有命中快取直接新增到mnetworkqueue佇列中。

可以自行分析processrequest方法檢視邏輯。可以自行分析processrequest方法檢視邏輯。

@override

public

void

run() catch (interruptedexception e) }}

}

網路請求處理

在networkdispatcher中與cachedispatcher一樣,一致迴圈處理請求。在mnetworkqueue中是從mnetworkqueue不斷的獲取請求進行網路請求。

可以自行分析processrequest方法檢視邏輯。

@override

public

void

run() catch (interruptedexception e) }}

}

這篇文章只是寬泛的講解一下,volley的網路請求的處理流程。並沒有深入的去分析,比如處理請求部分只是說明一致迴圈處理請求,並沒有說明佇列裡面內容為空了,執行緒會怎樣,佇列滿了如何處理請求,這塊設計到執行緒的設計。而本篇只是從結構上說明請求的處理。後面還會針對執行緒進行講解。

volley對於請求的處理採用了生產者-消費者模型。

在做元件時,需要設計如何新增請求,新增到**,以及如何處理請求,這塊是元件的脈絡,而其他的設計是骨肉涉及更細節的結構。

從請求資料處理為出發,分析第三方開源庫原始碼更容易一些。因為基本開源庫的涉及到多執行緒的處理(多執行緒處理中又以生產者-消費者模型為經典)。

over

Volley 原始碼分析

http 網路請求到底是怎麼傳送 http 網路請求的響應是怎麼分發 volley 中關鍵的類之間的關係 關鍵的類 1.http 網路請求怎麼傳送出去的?requestqueue.add start requestqueue的 add 方法,把 reqeust 物件新增到 mcachequeue 佇...

django原始碼分析 請求流程

1.瀏覽器解析輸入的url 2.查詢url對應的ip位址 3.通過ip位址訪問我們的伺服器 1.請求進入wsgi伺服器 我在這裡省略了可能存在的 伺服器,比如nginx 2.wsgi伺服器將請求包裝後,傳遞給django應用 3.django應用根據請求路徑找到相應的處理函式進行處理 4.處理完成後...

Struts2請求處理流程及原始碼分析

1.乙個請求在struts2框架中的處理步驟 a 客戶端初始化乙個指向servlet容器的請求 b 根據web.xml配置,請求首先經過actioncontextcleanup過濾器,其為可選過濾器,這個過濾器對於struts2和其他框架的整合 很有幫助 sitemesh plugin 主要清理當前...