Volley原理分析

使用了一段時間的volley的框架,感覺只知其然不知其所以然,不滿足封裝擴展,顧花了些時間研究一下其實現原理,如有出入歡迎指正~閒言少敘直接奔主題。

下面是根據理解自行畫制的Volley的類圖關係:


大家都知道在使用volley,三步走:

第一步:初始化Volley:RequestQueue mQueue = Volley.newRequestQueue(context);

第二步:創建Request:XXXRequest request=new XXXRequest(......);

第三步:加入隊列中:mQueue.Add(request);

詳細過程:

第一步,初始化RequestQueue消息隊列,requestQueue中有四個消息隊列mCurrentRequestQueues(HashSet集合,存放請求的消息)、mNetworkQueue(

PriorityBlockingQUeue的隊列,存放需要網絡通信的請求消息)、mCacheQueue(PriorityBlockingQUeue的隊列,存放需要使用緩存的請求消息)、

mWaitingRequest(是一個HashMap集合,用於存放已經使用過的緩存請求)。兩個調度器,mCacheDispatcher(緩存使用調度器)、mDispatchers(網絡請求調度器)。相應傳遞器,mDelivery。除初始化RequestQueue消息隊列機調度器外,還調用消息隊列的srart()方法。RequestQueue中srart()方法中同時啓動mCacheDispatchermDispatchers調度器,這兩個調度器都是繼承Thread的線程。

1、CacheDispatcher 緩存處理線程,

此線程主要請求爲緩存的請求,首先對緩存吃進行初始化,然後根據Request.getRequestKey()的key獲取緩存池中的緩存,交由分發器處理mDelivery,如果緩存池中沒有對應的數據,則放到網絡請求消息隊列中。

2、NeworkDispatcher 網絡處理線程,此線程處理需要請求網絡網絡請求的請求。網絡請求調用通信器的performRequest()方法獲取服務端信息,同時根據設置是否放入到緩存中。然後通過分發器回調給請求者。


第二步,創建Request請求,StringRequwst、JsonRequest之類的請求。


第三步,就是把請求加入到消息隊列中,通過ReqestQueue.Add()方法加入到mCurrentRequestQueues消息隊列中,同時會根據初始化時候的配置,將消息放到緩存請求隊列中還是網絡請求的消息隊列中。如果初始化設置了沒有使用緩存,將請求消息再放到mNetworkQueue網絡請求的消息隊列當中,如果設置了緩存則賢判斷是否已經在調用的緩存隊列中mWaitingRequest,如果沒有在mWaitingRequest隊列裏面則將消息放入到mCacheQueue隊列中同時放到mWaitingRequest的隊列中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章