volley之緩存、網絡與重試

基礎

        volley對所有的請求都有本地緩存,對同一請求一般先從緩存中獲取,獲取不到再從網絡獲取。通常對圖片進行三級緩存也是同樣的思路。

CacheDispatcher

        爲一個Thread,run()是一個死循環。與網絡方交互的邏輯如下:

                Cache.Entry entry = mCache.get(request.getCacheKey());
                if (entry == null) {
                    request.addMarker("cache-miss");
                    // Cache miss; send off to the network dispatcher.
                    mNetworkQueue.put(request);
                    continue;
                }

如果Cache中取不到,扔到網絡中處理的隊列中,然後由網絡在該隊列中取出請求,執行相應的網絡操作。

        整體思路爲:將網絡與緩存的處理分成單獨的類,避免了在類中對Cache獲取對象的if判斷,看起來優雅。

ImageLoader

        爲volley中圖片加載的類,也涉及到對圖片的三級緩存。但ImageLoader只提供了一個ImageCache接口,並沒有細分內存、sd卡等。這種設計方式,使得ImageLoader非常簡潔——它將所有的緩存都當ImageCache,不需要先判斷內存中有沒有,再判斷sd卡中有沒有,最後再從網絡中獲取,然後添加到內存、sd卡中等,使得整個ImageLoader的判斷減少,看起來更舒服。

        而外界對於內存、sd卡等緩存的處理,可以採用責任鏈模式。只是在處理結果時,需要將返回的結果添加到受理類前面的類中。

重試

        volley對每一個請求都進行了重試。主要的邏輯在於BasicNetwork#performRequest中。它是一個死循環,如果請求成功,直接return一個結果,循環結束。如果失敗,會調用attemptRetryOnException(),該方法內部會調用每一個Request指定的retry策略——默認只是將重試次數加一,並且將重試次數達到一定次數之後直接throw error,使得performRequest的循環因爲異常而結束

        這就是整個請求的重試策略,簡單簡單粗暴,但又能保證了每一個請求都會被重試固定的次數。

        




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