关于WeakHashMap引用问题

choha 发布于 2012/09/13 09:47
阅读 1K+
收藏 0

@迷途d书童 你好,想跟你请教个问题:

    我看了一下开源中国android的客户端源码,关于BitmapManager中的WeakHashMap引用能否起到内存回收问题。

源代码为:

   imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());//key是Imageview,

   我个人的感觉是,因为Imageview对于listview有引用,而且是强引用。既然是强引用那么是不是就没法做到内存回收?

  另外一个问题是关于:Bitmap设置为软引用能真正的回收bitmap所占用的内存空间吗?

private static HashMap<String, SoftReference<Bitmap>> cache;  代码的使用。因为内存回收软引用对象时,回收的是java对象,也就说把Bitmap所占的java内存空间回收了,而bitmap创建的时候有C空间,那么这样做能把bitmap所占用的C空间回收吗?

以下是问题补充:

@choha:1.既然ImageView是对于listview是强引用,而WeakHashMap和listview引用的是同一个对象,所以这个ImageView是属于强引用,为什么对WeakHashMap来说就弱引用呢? 2.关于bitmap释放问题,可不可以新建一个类,类中引用一个bitmap对象,然后将这个作为软引用所引用的对象,当新建类的finalize执行的时候,视频bitmap引用呢?代码如下: HashMap<String, SoftReference<TestReference>> cache; class TestReference { Bitmap bitmap; public TestReference(Bitmap bitmap) { this.bitmap = bitmap; } @Override protected void finalize() throws Throwable { if (bitmap != null) { bitmap.recycle(); bitmap = null; } super.finalize(); } } 这样做有问题吗? (2012/09/13 12:47)
加载中
0
choha
choha

引用来自“choha”的答案

引用来自“迷途d书童”的答案

WeakHashMap的Key是弱引用,虽然Imageview对于listview是强引用,但是对WeakHashMap来说就弱引用;
对于bitmap,内存自动回收软引用对象是java部分,而c部分确实需要recycle()方法来释放,问题是在头像列表中不能确实何时需要释放,只能通过缓存避免新建多个Bitmap对象,避免内存的浪费。

1.既然ImageView是对于listview是强引用,而WeakHashMap和listview引用的是同一个对象,所以这个ImageView是属于强引用,为什么对WeakHashMap来说就弱引用呢?

 

2.关于bitmap释放问题,可不可以新建一个类,类中引用一个bitmap对象,然后将这个作为软引用所引用的对象,当新建类的finalize执行的时候,视频bitmap引用呢?代码如下:

HashMap<String, SoftReference<TestReference>> cache;  

 class TestReference {

Bitmap bitmap;

 

public TestReference(Bitmap bitmap) {

this.bitmap = bitmap;

}

@Override

protected void finalize() throws Throwable {

if (bitmap != null) {

bitmap.recycle();

bitmap = null;

}

super.finalize();

}

}

这样做有问题吗?

测试一下开源中国的功能
0
迷途d书童
迷途d书童
WeakHashMap的Key是弱引用,虽然Imageview对于listview是强引用,但是对WeakHashMap来说就弱引用;
对于bitmap,内存自动回收软引用对象是java部分,而c部分确实需要recycle()方法来释放,问题是在头像列表中不能确实何时需要释放,只能通过缓存避免新建多个Bitmap对象,避免内存的浪费。
choha
choha
麻烦你在看一下我对问题补充说明,评论没法写那么多内容
0
choha
choha

1.既然ImageView是对于listview是强引用,而WeakHashMap和listview引用的是同一个对象,所以这个ImageView是属于强引用,为什么对WeakHashMap来说就弱引用呢?

 

2.关于bitmap释放问题,可不可以新建一个类,类中引用一个bitmap对象,然后将这个作为软引用所引用的对象,当新建类的finalize执行的时候,视频bitmap引用呢?代码如下:

HashMap<String, SoftReference<TestReference>> cache;  

class TestReference {

Bitmap bitmap;

 

public TestReference(Bitmap bitmap) {

this.bitmap = bitmap;

}

@Override

protected void finalize() throws Throwable {

if (bitmap != null) {

bitmap.recycle();

bitmap = null;

}

super.finalize();

}

}

这样做有问题吗?

0
choha
choha

引用来自“迷途d书童”的答案

WeakHashMap的Key是弱引用,虽然Imageview对于listview是强引用,但是对WeakHashMap来说就弱引用;
对于bitmap,内存自动回收软引用对象是java部分,而c部分确实需要recycle()方法来释放,问题是在头像列表中不能确实何时需要释放,只能通过缓存避免新建多个Bitmap对象,避免内存的浪费。

1.既然ImageView是对于listview是强引用,而WeakHashMap和listview引用的是同一个对象,所以这个ImageView是属于强引用,为什么对WeakHashMap来说就弱引用呢?

 

2.关于bitmap释放问题,可不可以新建一个类,类中引用一个bitmap对象,然后将这个作为软引用所引用的对象,当新建类的finalize执行的时候,视频bitmap引用呢?代码如下:

HashMap<String, SoftReference<TestReference>> cache;  

 class TestReference {

Bitmap bitmap;

 

public TestReference(Bitmap bitmap) {

this.bitmap = bitmap;

}

@Override

protected void finalize() throws Throwable {

if (bitmap != null) {

bitmap.recycle();

bitmap = null;

}

super.finalize();

}

}

这样做有问题吗?

choha
choha
回复 @迷途d书童 : 行,谢谢
迷途d书童
迷途d书童
回复 @choha : 这个没试过哦,不过你有兴趣可以拿客户端源码玩玩。
choha
choha
回复 @迷途d书童 : 如果ImageView的tag设置为TestRefrence,这样就保证了Bitmap所在的TestRefrence对象和bitmap同时属于强引用,当下次需要替换的时候,一同替换,这样呢?这样能解决掉吗?
choha
choha
如果ImageView的tag设置为TestRefrence,这样就保证了Bitmap所在的TestRefrence对象和bitmap同时属于强引用,当下次需要替换的时候,一同替换,这样呢?这样能解决掉吗?
迷途d书童
迷途d书童
1.WeakHashMap的Key是弱引用,Imageview是当做key传入WeakHashMap的,所以Imageview是弱引用。 2.Imageview始终要用到TestReference.getBitmap(),这里指是做了一个引用传递的功能,当TestReference被内存回收,Bitmap释放,Imageview显示就会出现问题。
返回顶部
顶部