天天看點

【第五篇】Volley代碼修改之圖檔二級緩存以及相關源碼閱讀(重寫ImageLoader.ImageCache)

有講到使用LRU來處理緩存的,但是隻是處理記憶體裡面的緩存,沒進行檔案緩存和處理,那麼如何實作Volley在本地的緩存呢

一般硬碟緩存使用com.jakewharton.disklrucache.DiskLruCache這個Lru緩存,具體代碼在

<a href="https://github.com/JakeWharton/DiskLruCache/tree/master/src%EF%BC%8C%E9%87%8C%E9%9D%A2%E4%B8%BB%E8%A6%81%E6%98%AF%E8%BF%99%E4%B8%89%E4%B8%AA%E7%B1%BB%EF%BC%9A">https://github.com/JakeWharton/DiskLruCache/tree/master/src,裡面主要是這三個類:</a>

重寫ImageCache實作圖檔二級緩存L2LRUImageCache.java

接下來考慮Volley正常加載圖檔時怎麼加載的,如下:

那麼調用L2LRUImageCache 進行二級緩存和緩存檔案讀取并加載到元件上面的邏輯也就在重寫imageLoader的邏輯裡面:

原生的volley裡面 imageLoader.get(string, listener);進入如下代碼

其中throwIfNotOnMainThread為檢查是否在主線程,代碼如下:

可見Imageloader加載圖檔必須運作在主線程。

然後getCacheKey擷取key資訊:如下解釋是為1級緩存建立緩存key,建立方法如代碼所述:

Bitmap cachedBitmap = mCache.getBitmap(cacheKey)然後就是去1級緩存裡面去都去緩存内容:

如下ImageCache是個接口,推薦使用LRUCache來實作1級緩存:

如果1級緩存不為null,就cachedBitmap回調給圖檔加載的response;

如果1級緩存為null的話,就去加載預設圖檔:

其中imageListener攜帶加載失敗和預設圖檔的設定資訊.

後面代碼就是如果這個圖檔url沒有請求過就會去請求,通過網絡的形式從伺服器端拉去圖檔資訊,并對成功失敗進行處理。

為了實作加載網絡圖檔二級緩存和從從二級緩存中讀取,必須重制原來的ImageLoader類,對緩存讀取,加載進行重寫:

AsyncImageLoader.java

1,可以設定線程池的大小,這裡設定為2條線程;

2,getDefaultImageLoader裡面調用上面的圖檔緩存的代碼L2LRUImageCache;

3,重點的讀取和緩存還是在get方法裡面。

然後看線程池裡面讀取緩存的邏輯:

mCache.getBitmap(cacheKey)是從一級緩存中區讀取bitmap,如果一級緩存裡面沒有,就去下載下傳,調用下面邏輯,拉取下來後,對圖檔進行裁剪,并将圖檔放入緩存裡面去,而mCache.putBitmap(cacheKey,bmpCompressed);就是調用L2LRUImageCache 的putbitmap放來将緩存内容放入檔案和記憶體中去。

代碼摘自:https://github.com/pocketdigi/PLib/tree/androidstudio/src/main/java/com/pocketdigi/plib/volley,可以參考優化volley對圖檔的二級緩存