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性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...