Android記憶體最佳化之記憶體緩衝

來源:互聯網
上載者:User

標籤:

什麼是緩衝?

緩衝技術原理就是把使用者訪問的所有對象看作一個全集,經過演算法標記哪些是使用者經常訪問的對象,把這些對象放到一個集合裡,這個集合是全集一個子集,下一次使用者再訪問的時候會先從這個子集集合中尋找使用者要訪問的對象如果找到就直接返回這個對象,如果沒有找到則再去全集中尋找。當然了我這裡說的只是原理性的東西,緩衝是有很多演算法的,並且有的不止一級緩衝,這裡就不過多講了。

 

為什麼要用到緩衝?

有緩衝的話可以不必每次從源地址讀取檔案,既節省了時間也節省了流量。尤其是手機裝置,頻繁的訪問網路資源會消耗很多使用者的流量和電量,這是使用者不能忍受的,所以無論從哪個方面考慮應用程式都必須加上緩衝。

 

Android中的圖片緩衝有哪些?各有什麼特點?

Android裝置的圖片緩衝分兩種,一種是記憶體緩衝,圖片緩衝在裝置的記憶體中,一種是外部緩衝,圖片緩衝在磁碟上,磁碟可以是內部的儲存空間也可以是外部的sd卡。這兩種緩衝各有各的優點,記憶體緩衝優點是快,缺點是因為也是讀取到記憶體中所以也會消耗記憶體,所以不能太大,用的時候要考慮分配的空間,還有一個缺點是應用重啟後就會消失。外部緩衝的優點是可以長久儲存大量的資料(相比較記憶體緩衝而言),缺點就是慢。

 

記憶體緩衝:

在Android中官網推薦使用LruCache作為記憶體緩衝,LruCache實際上就是一個LinkedHashMap( 補充知識:LinkedHashMap是一個雙向迴圈列表,不支援安全執行緒,LruCache對它進行了封裝添加了安全執行緒操作),裡面儲存了一定數量的對象強引用,每次添加的新對象都是在鏈表的頭,當分配的空間用完的時候會把末尾的對象移除,移除的對象就可以被gc回收了。這裡需要注意一下LruCache的容量,這個容量既不能太大,會造成OOM,又不能太小,起不到緩衝的作用。google官網給出一下意見作為參考:

·分配LruCache大小的時候考慮你的應用剩餘記憶體有多大;

·一次螢幕顯示多少張圖片,有多少張圖片是緩衝起來準備顯示的;

·考慮你的手機解析度和尺寸,緩衝相同的圖片個數,dpi越大的手機需要的記憶體就會越大;

·圖片解析度和像素品質也決定了佔用記憶體的大小;

·圖片訪問的頻繁程度是多少,是不是有一些圖片是經常訪問的?如果存在你可以考慮用多個·LruCache來做緩衝,按照訪問的頻率度分配到不同的LruCache中;

·如何平衡一片品質和數量,有些時候可以考慮緩衝低解析度的圖片,用到的時候再在後台請求更高品質的圖片;

·總之你分配的LruCache大小既不能太大,又不能太小,具體到應用中還要你綜合考慮。

 

下面的代碼是使用LruCache的例子:

1  privateLruCache<String, Bitmap> mMemoryCache;//聲明緩衝空間

2  finalint maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);//擷取應用在系統中的最大記憶體配置

3  //分配1/8的應用記憶體作為緩衝空間

4  finalint cacheSize = maxMemory / 8;

5  mMemoryCache= new LruCache<String, Bitmap>(cacheSize) {

6  @Override

7  protectedint sizeOf(String key, Bitmap bitmap) {

8  //重寫sizeOf方法,返回圖片的佔用位元組數而不是圖片的個數,每次添加圖片是會被調用

9  returnbitmap.getByteCount() / 1024;

10        }

11  };

 

    

注意:有同學可能會問下面的代碼:

1  intcacheSize=4*1024*1024;//4MiB

2  LruCachebitmapCache=newLruCache(cacheSize){

3  protectedintsizeOf(Stringkey,Bitmapvalue){

4  returnvalue.getByteCount();

5     }

6  }

這兩個sizeOf的計算是不一樣的,這裡說明一下,這個方法重寫的目的是返回圖片佔用的緩衝空間而不是圖片的數目,並且這個數值的單位要和cacheSize一樣。

 

總結:

綜合上面的講解,在使用記憶體緩衝LruCache時你需要知道如下知識:

LruCache封裝了LinkedHashMap,提供了LRU(LeastRecently Used 最近最少使用演算法)緩衝的功能;

LruCache通過trimToSize方法自動刪除最近最少訪問的鍵值對;

LruCache不允許空鍵值, LinkedHashMap允許;

LruCache安全執行緒, LinkedHashMap線程不安全;

繼承LruCache時,必須要複寫sizeOf方法,用於計算每個條目的大小。在put和get的時候會調用safeSizeOf(K key, V value),safeSizeOf(K key, Vvalue)會調用 sizeOf (K key, V value),這個方法預設返回1。

 

另外推薦一款第三方的內測工具對APP進行全方面的檢測:http://www.ineice.com/

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android記憶體最佳化之記憶體緩衝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.