我正在使用Android BitmapFun示例代码来管理我的应用程序中的位图。我在ViewPager中遇到了乱码或重复的图像。我已将其跟踪到ImageCache.java中的以下代码:
/**
* Notify the removed entry that is no longer being cached
*/
@Override
protected void entryRemoved(boolean evicted, String key,
BitmapDrawable oldValue, BitmapDrawable newValue) {
if (RecyclingBitmapDrawable.class.isInstance(oldValue)) {
// The removed entry is a recycling drawable, so notify it
// that it has been removed from the memory cache
((RecyclingBitmapDrawable) oldValue).setIsCached(false);
} else {
// The removed entry is a standard BitmapDrawable
if (Utils.hasHoneycomb()) {
// We're running on Honeycomb or later, so add the bitmap
// to a SoftRefrence set for possible use with inBitmap later
mReusableBitmaps.add(new SoftReference<Bitmap>(oldValue.getBitmap()));
}
}
}
当从缓存中删除位图时,位图将添加到可重用位图列表中。在这种情况下,ViewPager视图仍在使用位图。创建后一个视图时,将重用位图(仍在使用中),并且位图将出现在ViewPager中的两个位置。
从LruCache中删除的位图不一定可以重复使用。我在此代码中禁用了位图的重用,并且不再有问题。较低分辨率图像不会出现此问题,因为在ViewPager的屏幕外限制范围内,位图不会从缓存中删除。我没有60 DPI图像的问题,但在160 DPI时经常看到这个问题。我认为这将显示在具有更高分辨率图像的原始BitmapFun样本中。
其他人遇到过这个问题,或者我不能正确理解这个问题?
凯文
答案 0 :(得分:1)
我认为代码的问题在于
mReusableBitmaps.add(new SoftReference<Bitmap>(oldValue.getBitmap()));
该行将从LRU缓存中删除的位图添加到可重复使用的位图集中,以用于inBitmap重用。它不会检查它是否仍在被ImageView使用。如果您尝试重新使用仍由ImageView使用的位图,则基础位图将替换为另一个位图,使其不再有效。我的建议是在将Imagemap添加到可重用位图集之前跟踪ImageView是否仍在使用位图。我为此问题创建了一个示例github project。告诉我你对我的解决方案的看法。