圖片緩衝:ImageCache和ImageSdCache(一)

來源:互聯網
上載者:User

 對於用戶端——伺服器端應用,從遠程擷取圖片算是經常要用的一個功能,而圖片資源往往會消耗比較大的流量,對應用來說,如果處理不好這個問題,那會讓使用者很崩潰,不知不覺手機流量就用完了,等使用者發現是你的應用消耗掉了他手機流量的話,那麼可想而知你的應用將面臨什麼樣的命運。

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

sdcard儲存:

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



當需要擷取圖片時,就先從sdcard上的目錄中去找,如果找到的話,使用該圖片,並更新圖片最後被使用的時間。如果找不到,通過URL去download

去伺服器端下載圖片,如果下載成功了,放入到sdcard上,並使用,如果失敗了,應該有重試機制。比如3次。

下載成功後儲存到sdcard上,需要先判斷10M空間是否已經用完,如果沒有用完就儲存,如果空間不足就根據LRU規則刪除一些最近沒有被使用者的資源。

記憶體儲存:

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

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

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

          

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.