3

我很想在 Manifest 中使用Android:LargeHeap="true"选项来获得一些额外的内存(我们正在处理 5+ MB 高分辨率 1980x1200 显示器上的位图,并期望很快会有更大的显示器。

我已经用完了所有正常的技巧来处理Android中位图的糟糕内存处理(即除了尝试祈祷它不会崩溃之外,没有办法知道碎片内存中是否有足够大的洞)。我已经花了数周时间优化、修整和应用其他技巧来最小化内存并防止崩溃。这是 2.x 与 3.x/4.x 中可以完成哪些功能的技巧,但将所有功能都保存在一个应用程序中。无需指出“如何优化位图”——我已经完成了这些并应用了我能做的。

2.x 版本不支持 LargeHeap,我将不同的图像用于在 2.x 中不需要 LargeHeap 选项的低分辨率屏幕。(也没有内存不足的问题)。

当 android:minSdkVersion="8" 时,它根本不会允许 Android:LargeHeap 选项。

有什么方法可以有条件地为 3.x 的系统包含 LargeHeap,而在 2.x 中忽略它?或者如果检测到 3.x,应用程序本身是否会尝试设置 LargeHeap?我找不到任何方法来做到这一点,但也许我忽略了一些技巧。

我也意识到 LargeHeap 相当糟糕,但我们已经没有其他技巧了。理想情况下,以编程方式执行 LargeHeap 会很好,只有在 OnCreate 程序真正需要(并允许)时。

4

3 回答 3

5

当 android:minSdkVersion="8" 时,它根本不会允许 Android:LargeHeap 选项。

是的,它会的。

现在,如果您的构建目标(例如,Properties > Android)设置为 API Level 8,它将无法编译。您将需要使用构建目标 API 级别 11 或更高版本进行编译。但android:minSdkVersion与它无关。该选项在旧设备上将被忽略。

有什么方法可以有条件地为 3.x 的系统包含 LargeHeap,而在 2.x 中忽略它?

在清单android:largeHeap="true"中的元素中使用。<application>

或者如果检测到 3.x,应用程序本身是否会尝试设置 LargeHeap?

AFAIK,没有编程方式来设置它。

于 2013-01-11T01:18:19.283 回答
5

我使用这种方法:

在 AndroidManifest.xml 中

android:largeHeap="@bool/largeheap"

我创建了 2 个 configuration.xml 文件

值中的第一个:configuration.xml

<bool name="largeheap">false</bool>

values-v11 中的第二个(仅用于版本 >= 11)

<bool name="largeheap">true</bool>
于 2014-04-24T13:08:45.833 回答
0

如果你处理很多大的位图,你最好使用 JNI,它不受堆限制,而是受设备 RAM 本身的限制。

另一种方法是根据设备有多少可用堆大小来灵活处理。

据我所知,使用 largeHeap 标志是可以的,但是你没有得到任何关于你得到多少堆大小的承诺,如果有的话。事实上,我不确定谷歌是否对制造商提出了关于它应该给你多少的要求。

为了使用 largeHeap 标志,只需在清单中设置它,并使用 targetSdk 将其设置为可用的最新标志。在 minSdk 中,您设置了您支持的最小 API,因此在旧设备上运行时会自动忽略此标志。属于新 API 的任何 xml 属性也是如此。

只有属于较新 API 的类和方法才会给您带来问题,但为此您应该阅读 Lint 的警告。

于 2013-07-24T07:24:09.543 回答