1. 程式人生 > >volley2--volley的使用和架構

volley2--volley的使用和架構

為什麽 網絡 vol 線程 大於 例如 直接 一個 所有

圖片:

技術分享

1.其實RequestQueue裏面有兩個隊列,一個我稱為緩存隊列mCacheQueue,一個稱為網絡隊列mNetworkQueue

如果請求要求加入緩存隊列(例如我們給request設置一個屬性ShouldCache,然後提供set方法來設置),將會試圖從硬盤緩存中獲取數據,如果沒有緩存,這個請求將被放入網絡隊列

如果請求不要求緩存,則直接加入網絡隊列。

加入隊列以後,我們開啟線程,從隊列中取出請求。

可想而知,我們最好有一個線程CacheDispatcher從緩存隊列中取,一個NetworkDispatcher從網絡隊列中取,然而網絡請求往往大量,所以volley實際上有多個線程同時從網絡隊列中取出請求(這裏涉及線程同步,volley使用PriorityBlockingQueue解決)

為什麽要先建立幾個線程,從隊列中取,而不是每個request開啟一個線程呢?這樣做的好處是避免重復大量創建線程所帶來的開銷,另外由於所有的request都存在在一個RequestQueue裏面,便於我們對request的管理,例如我們要關閉某個request,又或者我們請求了很多相同的request,對應這些操作,我們如果將request分散,是很難統一解決的,所以這樣用類似線程池的思想,統一管理線程。

同時,這樣做又會帶來不利,因為實際請求線程的線程數目是固定的,意味著當request數目大於線程數目時,有的線程將被阻塞,造成效率下降,更多的問題,會在接下來的文章提到。

至於CacheDispatcher和NetworkDispatcher是怎麽請求數據的呢?

對於NetworkDispatcher而言,必然是開啟網絡連接,然後獲取數據的(例如url.openConnection),這是我們的常用實現,先不做詳細解釋(volley對這些實現進行了更詳細的封裝)

volley2--volley的使用和架構