在Android中,有一个叫做LruCache类专门用来做图片缓存处理的。它有一个特点,当缓存的图片达到了预先设定的值的时候,那么近期使用次数最少的图片就会被回收掉。步骤: (1)要先设置缓存图片的内存大小,我这里设置为手机内存的1/8,手机内存的获取方式:int MAXMEMONRY = (int) (Runtime.getRuntime() .maxMemory() / 1024); (2)LruCache里面的键值对分别是URL和对应的图片 (3)重写了一个叫做sizeOf的方法,返回的是图片数量。
1 private LruCachemMemoryCache; 2 private LruCacheUtils() { 3 if (mMemoryCache == null) 4 mMemoryCache = new LruCache ( 5 MAXMEMONRY / 8) { 6 @Override 7 protected int sizeOf(String key, Bitmap bitmap) { 8 // 重写此方法来衡量每张图片的大小,默认返回图片数量。 9 return bitmap.getRowBytes() * bitmap.getHeight() / 1024;10 }11 12 @Override13 protected void entryRemoved(boolean evicted, String key,14 Bitmap oldValue, Bitmap newValue) {15 Log.v("tag", "hard cache is full , push to soft cache");16 17 }18 };19 }
(4)下面的方法分别是清空缓存、添加图片到缓存、从缓存中取得图片、从缓存中移除。 移除和清除缓存是必须要做的事,因为图片缓存处理不当就会报内存溢出,所以一定要引起注意。
1 public void clearCache() { 2 if (mMemoryCache != null) { 3 if (mMemoryCache.size() > 0) { 4 Log.d("CacheUtils", 5 "mMemoryCache.size() " + mMemoryCache.size()); 6 mMemoryCache.evictAll(); 7 Log.d("CacheUtils", "mMemoryCache.size()" + mMemoryCache.size()); 8 } 9 mMemoryCache = null;10 }11 }12 13 public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) {14 if (mMemoryCache.get(key) == null) {15 if (key != null && bitmap != null)16 mMemoryCache.put(key, bitmap);17 } else18 Log.w(TAG, "the res is aready exits");19 }20 21 public synchronized Bitmap getBitmapFromMemCache(String key) {22 Bitmap bm = mMemoryCache.get(key);23 if (key != null) {24 return bm;25 }26 return null;27 }28 29 /**30 * 移除缓存31 *32 * @param key33 */34 public synchronized void removeImageCache(String key) {35 if (key != null) {36 if (mMemoryCache != null) {37 Bitmap bm = mMemoryCache.remove(key);38 if (bm != null)39 bm.recycle();40 }41 }42 }