我有一个列表视图,其中显示图像,这些图像被下载并正确缓存。当我向下滚动列表并加载新项目时,我想回收最近最少使用的项目以节省内存。我已经成功实现了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);
}
答案 0 :(得分:1)
您必须记住,ImageView
(列表元素)中的convertView
一直在重复使用。简而言之,每次从convertView
显示新视图时,您都不会创建新的ListView
,而实际上只是重复使用滚动的最后一个元素。
因此,在您的情况下,假设您有一个列表,其中随时可以看到3个项目。当你清除第1项时,你也清除了第4项和第7项等等。
我无法指出这个问题咬你的确切点,但根据你的描述,我几乎可以肯定这是问题所在。