4

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

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 方法中。问题是,当我回收图像时,我可以看到屏幕上可见的图像也丢失了(注意,我只回收我知道不在屏幕上的图像)。

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

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

   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);
    }
4

1 回答 1

1

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

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

我无法指出这个问题对您造成影响的确切点,但根据您的描述,我几乎可以肯定这就是问题所在。

于 2012-12-05T17:11:31.977 回答