Volley解析

前言

Volley是什么鬼?

Volley是谷歌提出的網(wǎng)絡(luò)通信框架,該框架封裝了網(wǎng)絡(luò)通信和圖片加載,使得使用起來更加的簡單快捷。

為什么要使用Volley?

  • 基本的網(wǎng)絡(luò)通信框架中,底層實際都封裝了兩種通信方式:HttpUrlConnectTionHttpClient。這兩種方式實現(xiàn)比較復雜,因此,AsyncHttpClient底層封裝了具體的通信方式,而只將接口暴露給用戶,用戶使用起來十分的方便。
  • universal-imageLoader,則將重心放在圖片加載,以及圖片資源清除等。

這兩種框架功能較為細化,因此則顯得過于單一。因此google公司發(fā)布了Volley這個框架,既滿足了網(wǎng)絡(luò)通信的簡單化,又具有了圖片加載的功能,同時,增加了自定義的功能,用戶可以對該框架進行擴展來滿足自己的項目需求。

源代碼解析##

請求架構(gòu)圖###

請求架構(gòu)圖

RequestQueue會維護一個緩存調(diào)度線程和網(wǎng)絡(luò)調(diào)度線程。當一個請求被加入到隊列中后,首先由緩存線程來對該請求進行篩選,如果該請求的內(nèi)容在緩存中可以找得到話,則緩存線程會來解析緩存內(nèi)容,并將解析的內(nèi)容分發(fā)到主線程;如果緩存中沒有相關(guān)的內(nèi)容時,則緩存調(diào)度線程會將該請求移交給網(wǎng)絡(luò)調(diào)度線程中的通信隊列中,該線程依次取出隊列中的請求,發(fā)起http請求,得到回應(yīng)后,將返回的數(shù)據(jù)進行解析,并寫入緩存中,同時將該內(nèi)容分發(fā)給主線程。

具體源碼流程分析###

  1. Volley.newRequestQueue(context),首先調(diào)用該類時,重載了newRequestQueue(context,null)方法,在該方法中初始化相關(guān)信息,比如緩存地址,HttpStack。其中HttpStack為網(wǎng)絡(luò)通信的代理類,里面封裝著相應(yīng)的通信實體(在版本大于9,也就是版本大于2.3時,采用的是httpClientStack,里面封裝這httpUrlConnection,小于9時,采用的是httpclient),然后生成請求隊列實例,并start;

  2. RequestQueue.start() 在請求隊列邏輯處理中,會開啟兩種線程:緩存調(diào)度線程和網(wǎng)絡(luò)調(diào)度線程,其中緩存調(diào)度線程有1個,而網(wǎng)絡(luò)調(diào)度線程默認有4個。

  3. requestQueue.add() 向請求隊列中加入請求后,就可以完成網(wǎng)絡(luò)通信了。那么add里面的操作是什么呢?

    • 首先判斷該請求是否需要加入緩存if (!request.shouldCache()),如果不需要加入,則直接交給網(wǎng)絡(luò)請求隊列;
    • 需要加入緩存時,會進行判斷,看等待隊列中是否含有key,如果含有key,則將其數(shù)據(jù)加入到隊列中,放入到該隊列中。Queue<Request<?>> stagedRequests = mWaitingRequests.get(cacheKey);;如果沒有相同的key,則在等待隊列中加入該key,value為null,并加入緩存線程中。接下來,緩存線程就運行起來了
  4. 緩存線程 CacheDispatcher 緩存線程的run方法中,執(zhí)行邏輯如下:

    • 該線程while(true),可以看出該線程一直在后臺運行。
    • 嘗試從緩存中取出緩存內(nèi)容,如果內(nèi)容為空,則直接就加入到網(wǎng)絡(luò)請求隊列中。緩存內(nèi)容過期,同理;
    • 通過parseNetWorkResponse來對緩存內(nèi)容進行解析,并回調(diào)。
  5. **網(wǎng)絡(luò)通信線程 NetworkDispatcher ** 執(zhí)行邏輯如下:

    • 該線程,也是一直在后臺運行;
    • 該通過performRequest()發(fā)起網(wǎng)絡(luò)請求。該performRequest實際上調(diào)用了BasicNetWork實現(xiàn),在其內(nèi)部,調(diào)用了httpStack的performStack,而這個就是之前實例化的httpStack。
    • 通過parseNetWorkResponse來解析返回的數(shù)據(jù),并寫入到緩存中。
    • 如何回調(diào)到主線程中? 通過ResponseDeliveryRunnable()方法,將數(shù)據(jù)傳給response.deliverResponse();在該類中,將數(shù)據(jù)傳給response.listener的onResponse的方法中。

Volley的緩存策略###

  只采用了磁盤緩存
磁盤緩存流程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容