我是所有内存管理主题的新手,所以有很多东西我不明白。
我正在尝试在我的应用程序中缓存图像,但我遇到了内存消耗方面的问题:
所有 Bitmap Chaching 代码几乎都是从这里复制粘贴的:http://developer.android.com/training/displaying-bitmaps/index.html
我在 eclipse 的 DDMS View 中调试了代码并检查了堆大小,在这些代码行之后有大约 15mb 的跳转:
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
在“decodeSampledBitmapFromResource”方法中。
图像是 1024x800,75kb 的 jpg 文件。根据我已经在互联网上看到的,这张图片应该占用的内存量约为 1024*800*4(Bytes per pixel)=3.125mb
关于这个主题的所有线程都没有说明为什么它比它应该占用更多的内存。有没有办法以合理的内存量缓存一张图片?
编辑
我尝试使用下面@ArshadParwez 的回答中建议的 decodeFile 方法。使用这种方法,在 BitmapFactory.decodeStream 方法之后,内存仅增加了 3.5mb - 问题解决了,但我想直接从资源中缓存位图。
我注意到在 decodeResource 方法期间有 2 个内存“跳跃”——一个大约 3.5mb——这是合理的,另一个奇怪的是 14mb。那 14mb 有什么用,为什么会这样?
最佳答案
图像也会根据密度进行缩放,因此它们会占用大量内存。
例如,如果图像文件位于 drawable
文件夹中(即 mdpi
密度)并且您在 xhdpi
设备上运行它,宽度和高度都会翻倍。也许this link可以帮助你,或者this one .
因此在您的示例中,图像文件将占用的字节是:
(1024*2)*(800*2)*4 = 13,107,200 bytes.
如果您在 xxhdpi
设备(如 HTC one 和 Galaxy S4)上运行它,情况会更糟。
你能做什么?将图像文件放入正确的密度文件夹(drawable-xhdpi
或 drawable-xxhdpi
)或将其放入 drawable-nodpi
(或 Assets 文件夹)并根据您的需要缩小图像。
顺便说一句,您不必设置 options.inJustDecodeBounds = false
因为这是默认行为。事实上,您可以为位图选项设置 null。
关于缩小比例,您可以使用 google's way或 my way每个都有自己的优点和缺点。
关于缓存有很多种方法。最常见的是 LRU 缓存。我最近还创建了一个替代方案(链接 here 或 here),它允许您缓存更多图像并避免出现 OOM,但它给您带来了很多责任。
关于java - Android - 位图缓存占用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18255572/