android 内存缓冲机制:
import java.lang.ref.SoftReference;
import java.util.LinkedHashMap;
import android.graphics.Bitmap;
import android.util.Log;
import android.util.LruCache;
/**
* @ClassName: MemoryCache
* @date 2014-6-11 下午05:30:25
* @Description: idea:1,two memory cache 2,file cache 3,network get
* @old modify:
* @new modify:
* @Version:
*/
public class MemoryCache {
// 1,two memory cache 2,file cache 3,network get
public static final String TAG = "memory";
// hard cache memory size
private final static int HARD_MEMORY_SIZE = 8 * 1024 * 1024;// 8m
// sofe cache num
private final static int SOFT_CACHE_CAPACITY = 6;
// hard cache
private final static LruCache<String, Object> mHardBitmapCache = new LruCache<String, Object>(
HARD_MEMORY_SIZE) {
@Override
public int sizeOf(String key, Object value) {
return ((Bitmap) value).getRowBytes() * ((Bitmap) value).getHeight();
// return 0;//not recycle memory
}
@Override
protected void entryRemoved(boolean evicted, String key,
Object oldValue, Object newValue) {
Log.v(TAG, "*********hard cache is full , push to soft cache*************");
// 硬引用缓存区满,将一个最不经常使用的oldvalue推入到软引用缓存区
mSoftBitmapCache.put(key, new SoftReference<Object>(oldValue));
}
};
@SuppressWarnings("serial")
private final static LinkedHashMap<String, SoftReference<Object>> mSoftBitmapCache = new LinkedHashMap<String, SoftReference<Object>>(
SOFT_CACHE_CAPACITY, 0.75f, true) {
@Override
public SoftReference<Object> put(String key, SoftReference<Object> value) {
Log.v(TAG, "*******SoftReference******get put bitmap******");
return super.put(key, value);
}
@Override
protected boolean removeEldestEntry(
Entry<String, SoftReference<Object>> eldest) {
if (size() > SOFT_CACHE_CAPACITY) {
Log.v(TAG, "Soft Reference limit , purge one");
return true;
}
return false;
}
};
// 缓存bitmap
public static boolean putBitmapInCache(String key, Object bitmap) {
if (bitmap != null) {
synchronized (mHardBitmapCache) {
Log.v(TAG, "putBitmapInCache...HardBitmapCache.size->" + mHardBitmapCache.size() + " key:" + key);
mHardBitmapCache.put(key, bitmap);
}
return true;
}
return false;
}
// 从缓存中获取bitmap
public static Bitmap getBitmapFromCache(String key) {
Bitmap bitmap = null;
synchronized (mHardBitmapCache) {
bitmap = (Bitmap) mHardBitmapCache.get(key);
if (bitmap != null) {
Log.v(TAG, "getBitmapFrom Hard Cache.............key:" + key);
return bitmap;
}
}
// 硬引用缓存区间中读取失败,从软引用缓存区间读取
synchronized (mSoftBitmapCache) {
SoftReference<Object> bitmapReference = mSoftBitmapCache.get(key);
if (bitmapReference != null) {
bitmap = (Bitmap) bitmapReference.get();
if (bitmap != null) {
Log.v(TAG, "getBitmapFrom Soft Cache..........key:" + key);
return bitmap;
} else {
Log.v(TAG, "soft reference is recycle...");
mSoftBitmapCache.remove(key);
}
}
}
return bitmap;
};
public static void freeMemory() {
Log.v(TAG, "freeMemory.............");
mHardBitmapCache.evictAll();
mSoftBitmapCache.clear();
// Clear the cache, calling entryRemoved(boolean, K, V, V) on each
// removed entry.
}
}