gpt4 book ai didi

android - 何时应该使用 LRUCache 回收位图?

转载 作者:IT王子 更新时间:2023-10-28 23:40:36 28 4
gpt4 key购买 nike

我正在使用 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;
}
};

这修复了崩溃,但它也导致图像有时不会出现在应用程序中(只是图像应该存在的黑色空间)。任何时候发生这种情况,我都会在我的 Logcat 中看到这条消息:Cannot generate texture from bitmap.

快速谷歌搜索显示,这是因为正在显示的图像已被回收。

那么这里发生了什么?如果我只是在它们被删除后回收它们,为什么回收的图像仍然在 LRUCache 中?实现缓存的替代方法是什么? Android 文档明确指出 LRUCache 是要走的路,但他们没有提到回收位图的必要性或如何这样做。

已解决:如果它对其他人有用,则接受的答案所建议的解决此问题的方法是 NO 做我在上面的代码示例中所做的事情(不要回收 中的位图entryRemoved() 调用)。

相反,当您使用完 ImageView(例如 Activity 中的 onPause() 或在适配器中回收 View 时)检查位图是否仍在缓存中(我在我的缓存类中添加了一个 isImageInCache() 方法,如果不是,则回收位图。否则,别管它。这修复了我的 OutOfMemory 异常并阻止了回收仍在使用的位图。

最佳答案

I believe that when the LRUCache evicts an image to make room for another one, the memory is not being freed.

Bitmap 被回收或垃圾收集之前不会。

A quick google search reveals that this is happening because the image which is displaying has been recycled.

这就是为什么你不应该在那里回收。

Why are recycled images still in the LRUCache if I'm only recycling them after they've been removed?

大概,它们不在 LRUCache 中。它们位于 ImageView 或仍在使用 Bitmap 的其他东西中。

What is the alternative for implementing a cache?

为了论证,假设您在 ImageView 小部件中使用 Bitmap 对象,例如在 ListView 的行中。

当你完成一个 Bitmap (例如,一个 ListView 中的行被回收),你检查它是否还在缓存中。如果是,你别管它。如果不是,你 recycle() 它。

缓存只是让您知道哪些 Bitmap 对象值得持有。缓存无法知道 Bitmap 是否仍在某处使用。

顺便说一句,如果您在 API 级别 11+,请考虑使用 inBitmap . OutOMemoryErrors 在分配无法完成时触发。上次我检查过,Android 没有压缩垃圾收集器,所以你可能会因为 fragment (想要分配比最大的单个可用 block 更大的东西)而得到 OutOfMemoryError

关于android - 何时应该使用 LRUCache 回收位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10743381/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com