2

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

我想提前算出我能有多少。

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

我不想缩小位图,也不想使用 RGB565。我只是想要一种相当可靠的方法来确定我可以允许多少撤消步骤。

谢谢

编辑#1

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

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

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

编辑#2

无奈之下,我决定在清单中打开largeHeap。我知道不建议这样做,但它使 Tab 3 的行为更具可预测性,并且可能说明了一些潜在问题。

4

2 回答 2

0

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

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

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

但是,由于 Galaxy Tab 3 似乎没有高密度屏幕,我认为您会得到 OOM,因为堆大小对于容纳所有位图来说很小。

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

于 2013-09-22T09:00:36.960 回答
0

在 Android 中获取可用内存似乎有点奇怪,但事实证明,我的主要问题是在较新版本的 Android 上,位图的内存分配发生了变化,现在它们很容易突破堆的限制。

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

于 2013-10-01T03:04:54.710 回答