本帖最后由 summersrest 于 2014-07-04 10:16:37 编辑

解决方案 »

  1.   

    有显示相同的图片的情况么(图片url 是一样的。)? 比如 你被摧毁的图片在当前item上使用, 这样就会导致图片被recycle 而你的控件正在使用这个图片绘制。
      

  2.   

    如果有相同的url  你要控制图片的引用计数  只有为0 你才能回收。
      

  3.   

    按照我的想法,应该是重新创建一个bitmap,然后再压入map中,不是这样的吗?
      

  4.   

    Bitmap bitmap = ImageLoader.loadBitmap(relative, list.get(arg1), new ImageCallBack() {
    @Override
    public void imageLoad(RelativeLayout relative, Bitmap bitmap) {
    // TODO Auto-generated method stub
    relative.setBackgroundDrawable(new BitmapDrawable(bitmap));
    }
    });
    if (bitmap == null) {
    relative.setBackgroundDrawable(new BitmapDrawable(bt));
    } else {
    relative.setBackgroundDrawable(new BitmapDrawable(bitmap));
    }// 将bitmap加载到map中,方便用过之后回收掉
    cacheBit.put(arg1, new SoftReference<Bitmap>(bitmap));/
    这里 你有可能将bitmap=null  缓存进cache中。
    //初始化时候  你的 bitmap 必然 为null ,但是你依然将这个null 写入缓存
      

  5.   

    根据代码看,你应该是使用ImageLoader 这个第三方的工具,
    基本上比较完善的工具都会提供图片缓存机制,并有比较完善的淘汰算法。
    当你的item摧毁时候,你recyle bitmap,但是对于imageLoader 它不知这个图片recycle了,就有可能同样的url 他返回的还是这个recycled 的图片。你检查下。 
      

  6.   


    你说的非常对,厉害啊,你这么以提示我真的发现问题了,果然是我考虑的不周全的问题,bitmap做过两次缓存,在adapter中一次,在imageLoader 里面也缓存过一次,adapter中的代码没有问题,但是adapter中回收了以后imageLoader 中并不知道已经被回收掉,根据键值判断该bitmap存在,但事实上该bitmap已被回收掉。所以报错了。知道错在哪里了,和你说的一模一样,非常感谢。希望见到过这个帖子的人别和我犯同样的错误了。
      

  7.   

    你好,我同意的也遇到了这个问题,我想请教下 imageloader  你后来是怎么处理的?
      

  8.   

    已解决 imageloader 有清除缓存的方法