android基础学习之强引用和弱引用的对比理解

android中出现强引用于弱引用是为了优化内存管理,以下是自己的理解。
强引用是对象只有在程序销毁后或者手动清楚时才会被清楚掉,如new一个新的对象等,这是强引用对象。
弱引用是当程序的内存不够时,gc会将其回收掉,高版本的android系统会倾向于回收若引用,所以其不稳定性变得更大。
强引用的核心类是LruCache,给他设定一个大小,当其存储的对象值大于设定值时,android系统就会清除一部分不常使用的对象
代码如下:
  LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) {
     protected int sizeOf(String key, Bitmap value) {
            return value.getByteCount();
    }

但是如果你设置了cacheSize的大小而不复写sizeof方法,每增加的一个对象只是增加1,而不是增加的对象的实际大小,那么就会造成内存过大,sizeof要返回的是对象的实际大小

弱引用的核心类是SoftReference,软引用是当内存到一定程度后gc会将多余的对象回收掉,android2.3以后gc会多倾向于回收软引用对象,所以造成了软引用的更加不靠谱,但是软引用在特定环境下还是有很多用处

一下是关于软引用的代码类

public class SoftMap<K, V> extends HashMap<K, V> {
// 降低对象的引用级别
// 将V的应用级别降低到软引用对象


// 该集合放置的是袋子强引用对象
private HashMap<K, MySoftValue<V>> temp;
// 存放空袋子的引用
private ReferenceQueue<V> queue;


public SoftMap() {
// 降低对象引用级别的核心方法
Object o = new Object();
SoftReference sr = new SoftReference(o);


// 工作内容
// 1、将占用内存较多的手机装到袋子中(put,get……)
// 2、清理没用的空袋子
temp = new HashMap<K, MySoftValue<V>>();
queue=new ReferenceQueue<V>();
}


@Override
public V put(K key, V value) {
MySoftValue<V> sr = new MySoftValue<V>(key,value,queue);
temp.put(key, sr);
return null;
}


@Override
public V get(Object key) {
clearNullSoftReference();
MySoftValue<V> sr = temp.get(key);
if (sr != null) {
// 垃圾回收器清除,则此方法将返回 null
return sr.get();
}
return null;
}


@Override
public boolean containsKey(Object key) {
clearNullSoftReference();
// 什么才叫真正的含有
MySoftValue<V> sr = temp.get(key);
if (sr != null) {
if (sr.get() != null) {
return true;
}
// return sr.get()!=null;
}
return false;
}
/**
* 清理空袋子
*/
private void clearNullSoftReference() {
// 方式一:循环装袋子的集合(temp),检查那个是空袋子,如果是空删除
/**
* for(Map.Entry<K,V> item:temp.entrySet()) { item.getValue().get(); }
*/
// 绝大多数的情况下,内存充足时没有对象被删除,该循环==无用功
// 方式二:如果能够直接知道temp中谁是空袋子
// 到底谁最了解空袋子?GC(小偷)——在偷手机的时候记录账,把那个“袋子”手机给投注
// 查账——我们提供

// 轮询此队列,查看是否存在可用的引用对象。如果存在"一个"立即可用的对象,则从该队列中"移除"此对象并返回。否则此方法立即返回 null。 
MySoftValue<V> sr = (MySoftValue<V>) queue.poll();
while(sr!=null)
{
// 删除
temp.remove(sr.key);
sr = (MySoftValue<V>) queue.poll();
}

}
/**
* 加强板袋子(为袋子增加了一个标签)
* @author l
*
* @param <V>
*/
private class MySoftValue<V> extends SoftReference<V>{
Object key;


public MySoftValue(Object key,V referent,ReferenceQueue<? super V> q) {
// SoftReference(T referent, ReferenceQueue<? super T> q) 
super(referent,q);
this.key = key;
}

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值