当前位置: 首页 > 面试题库 >

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

米嘉禧
2023-03-14
问题内容

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

所有的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答案中建议的解码文件方法。使用此方法,在BitmapFactory.decodeStream方法之后,内存仅增加了3.5mb-问题已解决,有点类似,但我想直接从资源中缓存位图。

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


问题答案:

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

例如,如果图像文件位于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,但这给您带来了很多责任。



 类似资料:
  • Android Studio似乎比其他任何应用程序占用更多内存。Java二进制增加了速度,过一会儿就慢下来了。通常重启android studio可以解决这个问题,但是,我需要每隔几个小时重启一次。在撰写本文时,Android Studio和Java总共占用了大约2.5GB内存。以前觉得eclipse不好:) 我有10GB的RAM,但仍然发现它使用缓慢,有时偶尔会挂起。我想知道其他人是否也面临着同

  • 我正在制作一个应用程序,它在一个UImageView中显示gif,从Parse加载gif。我遇到的问题是,每当我加载一个Gif时,它都会使用大约20 mb的内存,而当我执行segue时,这个内存没有被分配。我从UImageView中删除了图像本身,但它仍然没有释放内存。 这是我用来显示GIF的代码: 这可能是我记忆问题的原因吗?感谢任何帮助!

  • 我在继续我的游戏超过8次后,我得到了OutOfMemory错误,因为堆逐渐填充。在使用MAT分析我的游戏堆时,我知道以下2个原因: 关键词Android.Graphics.Bitmap Byte[] 关键词java.lang.Object[]Android.content.res.resources 请提出解决方案

  • 问题内容: 我正在尝试创建一个文件下载程序作为后台服务,但是当计划了一个大文件时,首先将其放入内存中,然后在下载结束时将文件写入磁盘。 考虑到我可能同时下载许多文件,如何使文件逐渐写入磁盘保留内存? 这是我使用的代码: 问题答案: 我将回调更改为: 这工作得很好。

  • 问题内容: 我有一小段代码每隔五分钟拍摄一次我的桌面的屏幕截图。但是,我对它占用的内存量有些困惑-通常它会爬升到200mb RAM,我敢肯定这是多余的…谁能告诉我a)减少内存占用空间的明智方法或b)它为什么涨 可言 ? 问题答案: 其他答案是正确的:Java将使用允许的尽可能多的内存,这时它将进行垃圾回收。要解决此问题,可以在JVM设置中指定较小的最大堆大小。您可以使用- Xmx设置来执行此操作。

  • 【内存占用】页面主要展示项目运行过程中内存的使用情况,主要包括以下几个部分: 数据汇总 该项主要展示项目运行过程中的 “总内存峰值”、“堆内存峰值”、“GFX内存峰值” 和 “泄露风险”。其中,总内存为Unity引擎所统计的真实物理内存分配,并不包含系统缓存和第三方库的自身分配内存; 堆内存所指的是 Mono 管理和分配的托管堆内存; GFX内存为用于渲染的资源所占用的内存,主要包括纹理资源、网格