内存达到限制优先清理占据内存最大的bimap方案LargestLimitedMemoryCache
/**
* @描述:限定内存缓存大小,内存超出 优先清理bitmap占据内存最大的
* @filename:LargestLimitedMemoryCache.java
* @author:gac
* @time:2018/6/29 11:19
*/
public class LargestLimitedMemoryCache extends LimitedMemoryCache{
//强引用记录bitmap对象,和对应占据的尺寸 超出限制优先删除最大的bitmap
private final Map valueSizes = Collections.synchronizedMap(new HashMap());
public LargestLimitedMemoryCache(int sizeLimit) {
super(sizeLimit);
}@Override
public boolean put(String key, Bitmap value) {
if(super.put(key,value)){//super.put 会根据内存大小进行清理内存,调用removeNext 保存元素成功
valueSizes.put(value,getSize(value));
//记录bitmap对象 和bitmap的尺寸
return true;
}
return false;
}@Override
public Bitmap remove(String key) {
Bitmap value =https://www.it610.com/article/super.get(key);
if(value != null){
valueSizes.remove(value);
}return super.remove(key);
}@Override
public void clear() {
valueSizes.clear();
super.clear();
}@Override
protected Reference createReference(Bitmap value) {
return new WeakReference(value);
}@Override
protected int getSize(Bitmap value) {
return value.getRowBytes()*value.getHeight();
}@Override
protected Bitmap removeNext() {
Integer maxSize = null;
//最大bimap尺寸
Bitmap largestValue = https://www.it610.com/article/null;
//最大bitmap尺寸对象
Set> entries = valueSizes.entrySet();
//同步valueSizes 执行此操作 为了数据的正确性其它线程不允许操作
synchronized (valueSizes){
for(Map.Entry entry : entries){
if(largestValue =https://www.it610.com/article/= null){//初始化取第一个元素的值
largestValue = entry.getKey();
maxSize = entry.getValue();
}else{
Integer size = entry.getValue();
//取下一个元素的值
if(size> maxSize){//如果尺寸比上一个尺寸大 就重置为这个元素
maxSize = size;
largestValue = https://www.it610.com/article/entry.getKey();
}
}
}
}
valueSizes.remove(largestValue);
return largestValue;
}
}
【我只是代码搬运工|Bitmap 内存缓存框架(二)】内存达到限制,优先清理最新的数据,采取队列存储bitmap强引用FIFOLimitedMemoryCache
/**
* @描述:限制内存大小的情况下,队列保存bitmap 先保存的优先被删除
* @filename:FIFOLimitedMemoryCache.java
* @author:gac
* @time:2018/6/29 13:30
*/
public class FIFOLimitedMemoryCache extends LimitedMemoryCache {
//链表保存bitmap强引用 如果内存不够 优先删除队列头的元素
private final List queue = Collections.synchronizedList(new LinkedList());
public FIFOLimitedMemoryCache(int sizeLimit) {
super(sizeLimit);
}/**
* 保存元素
* @param key
* @param value
* @return
*/
@Override
public boolean put(String key, Bitmap value) {
if(super.put(key,value)){
queue.add(value);
return true;
}
return false;
}/**
* 删除元素
* @param key
* @return
*/
@Override
public Bitmap remove(String key) {
Bitmap value = https://www.it610.com/article/super.get(key);
if(value != null){
queue.remove(value);
}
return super.remove(key);
}@Override
public void clear() {
queue.clear();
super.clear();
}@Override
protected Reference createReference(Bitmap value) {
return new WeakReference(value);
}@Override
protected int getSize(Bitmap value) {
return value.getRowBytes()*value.getHeight();
}@Override
protected Bitmap removeNext() {//强引用删除,softMap保留引用 会自己被系统回收
return queue.remove(0);
}
}