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;
}
}
}
强引用是对象只有在程序销毁后或者手动清楚时才会被清楚掉,如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;
}
}
}
相关文章推荐
- Android基础部分再学习---全面理解Fragment
- android学习1 android应用的基础
- Android学习基础要点总结
- Android基础学习这获取本机电话号码
- Android入门学习_Android SQLite基础
- Android入门:深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系
- 指针的基础理解,以及引用的理解
- Android开发学习笔记-9 Service基础
- 学习android基础总结一
- Android基础学习之Intent
- Android开发学习笔记-2 Activity-1 基础
- Android Map开发基础知识学习笔记
- 关于Android零基础学习的思考
- Android Map开发基础知识学习笔记
- Android Map开发基础知识学习笔记
- Android Map开发基础知识学习笔记
- android学习必备java基础知识——内部类
- Android Map开发基础知识学习笔记
- Android入门:深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系 收藏
- Android开发学习笔记-7 Handler基础