您的位置:首页 > 移动开发 > Android开发

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

2015-02-05 09:56 190 查看
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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: