在列表视图上回收位图会导致问题

时间:2012-12-05 12:40:02

标签: android listview bitmap row recycle

我有一个列表视图,其中显示图像,这些图像被下载并正确缓存。当我向下滚动列表并加载新项目时,我想回收最近最少使用的项目以节省内存。我已经成功实现了LRU Map,并在位图上调用了回收,这些位图在屏幕上是不可见的。以下是代码的一部分:

imageView是一个ViewGroup

public void recycleImage(int res) {
    if (imageView != null) {
        imageView.setBackgroundDrawable(null);
        if (res > 0)
            imageView.setBackgroundResource(res);
    }

    if (bitmap != null && !bitmap.isRecycled()) {
        bitmap.recycle();

        Log.i(TAG, "Bitmap recycled");
    }
}

这些值保存在适配器的getView方法中。问题是,当我回收图像时,我可以看到屏幕上可见的图像也会丢失(请注意我只回收我知道的图像不在屏幕上)。

当我在listview上回收其他人的位图时,有没有人知道为什么我会丢失当前显示的图像?

这是我访问存储位图或下载它的地方。

   if (mImageMap.containsKey(url)) { 
       ImageCacheModel cache = mImageMap.get(url); 
       return cache.getBitmap(); 
   } else if (cacheManager.isUrlCached(url)) { 
       mImageMap.put(url, new ImageCacheModel(imageView, cacheManager.getCachedBitmapOrNull(url, 2)));

        ImageCacheModel cache = mImageMap.get(url);
        return cache.getBitmap();
    } else {
        cacheManager.addUrlToQueue(url, this, true);
    }

1 个答案:

答案 0 :(得分:1)

您必须记住,ImageView(列表元素)中的convertView一直在重复使用。简而言之,每次从convertView显示新视图时,您都不会创建新的ListView,而实际上只是重复使用滚动的最后一个元素。

因此,在您的情况下,假设您有一个列表,其中随时可以看到3个项目。当你清除第1项时,你也清除了第4项和第7项等等。

我无法指出这个问题咬你的确切点,但根据你的描述,我几乎可以肯定这是问题所在。