java – Android – 位图缓存占用很多内存

前端之家收集整理的这篇文章主要介绍了java – Android – 位图缓存占用很多内存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是所有的内存管理主题的新手,所以有很多我不明白的事情.
我试图在我的应用程序中缓存一个图像,但是我的内存消耗有麻烦:

所有的Bitmap Chach代码都是从这里复制粘贴的:http://developer.android.com/training/displaying-bitmaps/index.html

我在eclipse中调试了代码并检查DDMS视图中的堆大小,并且这些代码行之后大约有15mb跳转

options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res,resId,options);

在“decodeSampledBitmapFromResource”方法中.

图像是1024×800,75kb jpg文件.根据我在互联网上已经看到的内存,这个图像应该占用大约1024 * 800 * 4(每像素的字节数)= 3.125mb

所有关于这个问题的线程都不会说明为什么它比它应用更多的内存.有没有办法缓存一个图像与合理的内存?

编辑

我试过在@ ArshadParwez的答案下使用decodeFile方法.使用这种方法,在BitmapFactory.decodeStream方法之后,内存只增加了3.5mb – 问题解决了,但是我想直接从资源缓存位图.

我注意到,在decodeResource方法中,有2个内存“跳” – 大约3.5mb之一 – 这是合理的,另一个是14mb的奇怪之一. 14mb使用的是什么,为什么会发生这种情况?

解决方法

图像也按照密度进行缩放,因此可以使用大量内存.

例如,如果图像文件位于可绘制的文件夹(这是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(或资产文件夹)中,并根据需要对图像进行缩小.

BTW你不必设置options.inJustDecodeBounds = false,因为它是默认的行为.实际上,您可以为位图选项设置null.

关于缩小比例您可以使用google’s waymy way,每个都有自己的优点和缺点.

关于缓存有很多方法可以做到.最常见的是LRU缓存.还有一个我最近创建的一个选择(链接herehere),它允许您缓存更多图像,避免使用OOM,但它给您很大的责任.

猜你在找的Android相关文章