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缓存.还有一个我最近创建的一个选择(链接here或here),它允许您缓存更多图像,避免使用OOM,但它给您很大的责任.

以上是来客网为你收集整理的java – Android – 位图缓存占用很多内存全部内容,希望文章能够帮你解决java – Android – 位图缓存占用很多内存所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。