1. 程式人生 > >圖片快取:ImageCache和ImageSdCache(一)

圖片快取:ImageCache和ImageSdCache(一)

對於圖片資源來說,你不可能讓應用每次獲取的時候都重新到遠端去下載,這樣會浪費資源,但是你又不能讓所有圖片資源都放到記憶體中去(雖然這樣載入會比較快),因為圖片資源往往會佔用很大的記憶體空間,容易導致OOM。那麼如果下載下來的圖片儲存到SDCard中,下次直接從SDCard上去獲取呢?這也是一種做法,我看了下,還是有不少應用採用這種方式的。採用LRU等一些演算法可以保證sdcard被佔用的空間只有一小部分,這樣既保證了圖片的載入、節省了流量、又使SDCard的空間只佔用了一小部分。另外一種做法是資源直接儲存在記憶體中,然後設定過期時間和LRU規則。

sdcard儲存:

在sdcard上開闢一定的空間,需要先判斷sdcard上剩餘空間是否足夠,如果足夠的話就可以開闢一些空間,比如10M

Android 之圖片本地快取解決方案 - zhou_411424 - 惜世缺麟的部落格
當需要獲取圖片時,就先從sdcard上的目錄中去找,如果找到的話,使用該圖片,並更新圖片最後被使用的時間。如果找不到,通過URL去download
去伺服器端下載圖片,如果下載成功了,放入到sdcard上,並使用,如果失敗了,應該有重試機制。比如3次。
下載成功後儲存到sdcard上,需要先判斷10M空間是否已經用完,如果沒有用完就儲存,如果空間不足就根據LRU規則刪除一些最近沒有被使用者的資源。

記憶體儲存:

在記憶體中儲存的話,只能儲存一定的量,而不能一直往裡面放,需要設定資料的過期時間、LRU等演算法。這裡有一個方法是把常用的資料放到一個快取中(A),不常用的放到另外一個快取中(B)。當要獲取資料時先從A中去獲取,如果A中不存在那麼再去B中獲取。B中的資料主要是A中LRU出來的資料,這裡的記憶體回收主要針對B記憶體,從而保持A中的資料可以有效的被命中。

Android 之圖片本地快取解決方案 - zhou_411424 - 惜世缺麟的部落格

在這次手機應用開發中,我是將sdcard儲存和記憶體儲存兩種方法結合使用:在得到圖片的URL後,首先在記憶體中查詢,沒有找到,再到sd卡中查詢,若還是沒有找到,則開始非同步下載,下載完成後,將圖片同時快取到記憶體與sd卡中,便於下一次快速的獲取它。

採用兩者結合方式,優勢很明顯:能在記憶體沒有釋放前,快速獲取到圖片,減少對sd卡的存取;sd卡快取,又能彌補記憶體資源不足和長期儲存的確點。