基礎
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的循環因爲異常而結束。
這就是整個請求的重試策略,簡單簡單粗暴,但又能保證了每一個請求都會被重試固定的次數。