我有一个列表视图,我在其中显示图像,这些图像被下载并正确缓存。当我向下滚动列表并加载新项目时,我想回收最近最少使用的项目以节省内存。我已经成功实现了 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);
}