Android-位图缓存占用大量内存

奥里·瓦瑟曼(Ori Wasserman):

我是所有内存管理主题的新手,所以有很多我不了解的事情。
我正在尝试将图像缓存在我的应用程序中,但是我在内存消耗方面遇到了麻烦:

几乎所有Bitmap Chaching代码都可以从此处复制粘贴:http : //developer.android.com/training/displaying-bitmaps/index.html

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

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

在“ decodeSampledBitmapFromResource”方法中。

图片为1024x800、75kb jpg文件。根据我在互联网上看到的图像,该图像应该占用的内存量约为1024 * 800 * 4(每像素字节)= 3.125mb

有关此主题的所有线程都没有说出为什么它占用的内存比应有的多。有没有一种方法可以缓存具有合理内存量的图像?

编辑

我尝试使用下面@ArshadParwez答案中建议的encodeFile方法。使用此方法后,在BitmapFactory.decodeStream方法之后,内存仅增加了3.5mb-问题已解决,有点类似,但是我想直接从资源中缓存位图。

我注意到在encodeResource方法期间有2个内存“跳跃”-一个大约3.5mb-这是合理的,另一个奇怪的是14mb。这些14mb的用途是什么?为什么会发生这种情况?

android开发人员:

图像也会根据密度进行缩放,因此它们可以使用大量内存。

例如,如果图像文件位于drawable文件夹(mdpi密度)中,并且您在xhdpi设备上运行它,则宽度和高度都会加倍。也许这个链接可以帮助您,或者这个

因此,在您的示例中,图像文件将占用的字节为:

(1024 * 2)*(800 * 2)* 4 = 13,107,200字节

如果您在xxhdpi设备(例如HTC one和Galaxy S4)上运行它,甚至会更糟

你能做什么?可以将图像文件放置在正确的密度文件夹(drawable-xhdpidrawable-xxhdpi)中,也可以将其放置在drawable-nodpi(或资产文件夹中)并根据需要缩小图像尺寸。

顺便说一句,您不必设置,options.inJustDecodeBounds = false因为它是默认行为。实际上,您可以将位图选项设置为null。

关于缩放下来,你可以使用谷歌的方式我的方式每个人都有自己的优点和缺点。

关于缓存,有很多方法可以做到。最常见的一种是LRU缓存。我最近还创建了另一种方法(请在此处此处链接),该方法可以缓存更多的图像并避免使用OOM,但这给您带来了很多责任。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章