package com.pps.async; import java.lang.ref.SoftReference; import java.util.LinkedHashMap; import android.graphics.Bitmap; import android.support.v4.util.LruCache; /** * 进行内存的快速缓存--(硬引用于软引用) * <1:首先把图片加入到硬缓存中,/> * <2:当硬缓存中的容量达到上限的时候,把最近命中率最低的那缓存的图片加入到软缓存中,当系统的资源紧张的时候,系统进行回收/> * @author jiangqingqing * */ public class ImageLruCache { // 开辟8M的硬缓存空间; private final int hardCachedSize = 8 * 1024 * 1024; // 软引用 private static final int SOFT_CACHE_CAPACITY = 40; // 开软引用缓存 private LinkedHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache = new LinkedHashMap<String, SoftReference<Bitmap>>( SOFT_CACHE_CAPACITY, 0.75f, true); // 开硬引用缓存 private final LruCache<String, Bitmap> sHardBitmapCache = new LruCache<String, Bitmap>( hardCachedSize) { @Override protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) { super.entryRemoved(evicted, key, oldValue, newValue); // 当硬缓存区的的容量达到极限的时候,把最近最少使用的Bitmap对象存放入到软引用缓存中 sSoftBitmapCache.put(key, new SoftReference<Bitmap>(oldValue)); } @Override protected int sizeOf(String key, Bitmap value) { if(null!=value) { return value.getRowBytes()*value.getHeight(); }else { return 0; } } }; /** * 进行把图片放入到缓存当中去 * * @param key * @param bitmap */ public boolean putBitmap(String key, Bitmap bitmap) { if (null!=bitmap) { synchronized (sHardBitmapCache) { sHardBitmapCache.put(key, bitmap); return true; } } return false; } /** * 根据传入的Key值,去缓存中去获取图片 1:<先从硬缓存中获取图片,/> 2:<如果硬缓存中没有该对应的图片,那就从软缓存中去寻找,/> * 3:<如果软缓存中也也没有,那就去本地文件缓存中进行寻找,/> * * @param key * @return 获取到的图片 */ public Bitmap getBitmap(String key) { Bitmap bitmap = null; synchronized (sHardBitmapCache) { //该方法,默认把取到的缓存,重新加载到该linked的头部 bitmap = sHardBitmapCache.get(key); if (null!=bitmap) { return bitmap; } } // 硬缓存中没有,现在去软缓存中进行查找该图片 synchronized (sSoftBitmapCache) { SoftReference<Bitmap> softReference = sSoftBitmapCache.get(key); if (null!=softReference) { bitmap = softReference.get(); if (null!=bitmap) { return bitmap; } else { // 表示此刻的图片的软引用已经被回收了,那就进行移除 sSoftBitmapCache.remove(key); } } } return null; } /** * 清空缓存 */ public void clear() { sHardBitmapCache.evictAll(); } }