Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android通過軟引用實現圖片緩存,防止內存溢出示例

Android通過軟引用實現圖片緩存,防止內存溢出示例

編輯:Android開發實例

  1. public class BitmapCache { 
  2.     static private BitmapCache cache; 
  3.     /** 用於Chche內容的存儲 */ 
  4.     private Hashtable<Integer, MySoftRef> hashRefs; 
  5.     /** 垃圾Reference的隊列(所引用的對象已經被回收,則將該引用存入隊列中) */ 
  6.     private ReferenceQueue<Bitmap> q; 
  7.  
  8.     /** 
  9.      * 繼承SoftReference,使得每一個實例都具有可識別的標識。 
  10.       */ 
  11.     private class MySoftRef extends SoftReference<Bitmap> { 
  12.         private Integer _key = 0; 
  13.  
  14.         public MySoftRef(Bitmap bmp, ReferenceQueue<Bitmap> q, int key) { 
  15.             super(bmp, q); 
  16.             _key = key; 
  17.         } 
  18.     } 
  19.  
  20.     private BitmapCache() { 
  21.         hashRefs = new Hashtable<Integer, MySoftRef>(); 
  22.         q = new ReferenceQueue<Bitmap>(); 
  23.     } 
  24.  
  25.     /** 
  26.      * 取得緩存器實例 
  27.       */ 
  28.     public static BitmapCache getInstance() { 
  29.         if (cache == null) { 
  30.             cache = new BitmapCache(); 
  31.         } 
  32.         return cache; 
  33.     } 
  34.  
  35.     /** 
  36.      * 以軟引用的方式對一個Bitmap對象的實例進行引用並保存該引用 
  37.       */ 
  38.     private void addCacheBitmap(Bitmap bmp, Integer key) { 
  39.         cleanCache();// 清除垃圾引用 
  40.          MySoftRef ref = new MySoftRef(bmp, q, key); 
  41.         hashRefs.put(key, ref); 
  42.     } 
  43.  
  44.     /** 
  45.      * 依據所指定的drawable下的圖片資源ID號(可以根據自己的需要從網絡或本地path下獲取),重新獲取相應Bitmap對象的實例 
  46.      */ 
  47.     public Bitmap getBitmap(int resId, Context context) { 
  48.         Bitmap bmp = null; 
  49.         // 緩存中是否有該Bitmap實例的軟引用,如果有,從軟引用中取得。 
  50.          if (hashRefs.containsKey(resId)) { 
  51.             MySoftRef ref = (MySoftRef) hashRefs.get(resId); 
  52.             bmp = (Bitmap) ref.get(); 
  53.         } 
  54.         // 如果沒有軟引用,或者從軟引用中得到的實例是null,重新構建一個實例, 
  55.          // 並保存對這個新建實例的軟引用 
  56.          if (bmp == null) { 
  57.             // 傳說decodeStream直接調用JNI>>nativeDecodeAsset()來完成decode, 
  58.               // 無需再使用java層的createBitmap,從而節省了java層的空間。 
  59.               bmp = BitmapFactory.decodeStream(context.getResources() 
  60.                     .openRawResource(resId)); 
  61.             this.addCacheBitmap(bmp, resId); 
  62.         } 
  63.         return bmp; 
  64.     } 
  65.  
  66.     private void cleanCache() { 
  67.         MySoftRef ref = null; 
  68.         while ((ref = (MySoftRef) q.poll()) != null) { 
  69.             hashRefs.remove(ref._key); 
  70.         } 
  71.     } 
  72.  
  73.     /** 
  74.      * 清除Cache內的全部內容 
  75.      */ 
  76.     public void clearCache() { 
  77.         cleanCache(); 
  78.         hashRefs.clear(); 
  79.         System.gc(); 
  80.         System.runFinalization(); 
  81.     } 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved