确定位图的可用内存

时间:2013-09-20 09:00:28

标签: android memory bitmap

我正在开发一个图形应用程序,我想保留一组用于撤消操作的位图。位图非常大,每个大约9M,所以我意识到我只能在任何给定时间保留一些内存。

我想提前确定一下我可以拥有多少。

我已经尝试了各种查询可用内存的方法,并且在不需要时会小心回收位图,但尽管应用程序似乎与EOutOfMemory崩溃了。

我不想缩小位图,或使用RGB565。我只想要一个相当可靠的方法来确定我可以允许的撤消步骤数量。

由于

编辑#1

我继续尝试各种方法来确定可用内存,包括与评论中链接的内容,但仍然存在问题。

奇怪的是,我的旧三星I9000手机在创建和访问每个9MB大小的位图时没有太多问题,但是我的新三星Tab 3在分配第三个位图时死机。

应该有足够的内存。我确实读过一些关于在Android 3及更高版本上为位图分配内存的区别,但是没有完全理解它。这可能是导致我的Tab死于EOutOfMemory的原因吗?

编辑#2

绝望中我决定在清单中打开 largeHeap 。我知道这不是推荐的,但它使得Tab 3的表现更加可预测,并且它可能展示了一些潜在的问题。

2 个答案:

答案 0 :(得分:0)

这让我想起了将图像文件放入“res / drawable”文件夹的一个非常常见的错误。

这样的事情会导致位图占用更多的内存,屏幕密度越高。

例如,对于100x100图像,mdpi设备上只需要100 * 100 * 4 = 40,000个字节,但它需要(2 * 100)*(2 * 100)* 4 = 160,000个字节xhdpi设备(4倍以上)。

然而,由于星系标签3似乎没有高密度屏幕,我认为你得到OOM,因为堆大小很小,无法容纳所有位图。

查看我的帖子here,了解一些内存和位图提示。

答案 1 :(得分:0)

似乎获取可用内存在Android中有点古怪,但事实证明我的主要问题是在较新版本的Android上,位图的内存分配已经改变,现在它们很容易超出堆的限制。

在清单中设置largeHeap让我解决了这个问题,但我仍然不确定它是否理想。