我正在使用LRUCache缓存存储在文件系统上的位图.我根据这里的示例构建了缓存:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
问题是我在使用应用程序时经常看到OutOfMemory崩溃.我相信当LRUCache驱逐图像为另一个图像腾出空间时,内存不会被释放.
当图像被驱逐时,我添加了对Bitmap.recycle()的调用:
// use 1/8 of the available memory for this memory cache
final int cacheSize = 1024 * 1024 * memClass / 8;
mImageCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) {
oldBitmap.recycle();
oldBitmap = null;
}
};
Run Code Online (Sandbox Code Playgroud)
这可以解决崩溃问题,但是它也会导致图像有时不会出现在应用程序中(只是图像所在的黑色空间).任何时候我都会在Logcat中看到这条消息:Cannot generate texture from bitmap.
一个快速谷歌搜索显示这是发生,因为显示的图像已被回收.
那么这里发生了什么?为什么再循环图像仍然在LRUCache中,如果我只是在它们被删除后回收它们?实现缓存的替代方法是什么?Android文档明确指出LRUCache是可行的方法,但他们没有提到回收位图的必要性或如何做到这一点.
解决: 如果它有用给其他人,由接受的答案建议解决这个问题是不是做什么,我在做上面的代码示例(不回收的位图 …