0

我正在创建一个 Android 应用程序,直到现在我还没有耗尽内存。令人困惑的部分是这不是我期望的内存不足的方式。

我只是在布局 xml 文件中添加了一个新的线性布局。它有一个 40kb 大的图像背景。加载的其他图像大约为 12kb,背景更大,为 120kb。加载此图像后,我会在运行时收到致命信号 11。如果我从布局中删除背景,它会正常工作。然后我将图像更改为小得多,之前是(2000x600),所以现在是 14kb。它现在工作正常。很明显,额外的 26kb 导致了问题......

我应该采取什么样的预防措施来确保这种情况不再发生。显然我想要高质量的图像,而 2000x600 可能会过高,因为它是手机应用程序,但我应该遵循哪些准则?

是否有可以扩展的内存使用上限或我应该保持在以下?另外,如果我在滚动视图上加载了许多图像,这会导致应用程序崩溃吗?我一次加载了许多图像,但以前从未崩溃过,我只是对由很少的内存使用引起的错误感到困惑。(至少在今天的情况下。)

问候,

杰克

4

1 回答 1

0

图像在 RAM 中消耗的内存量与在磁盘上消耗的内存量不同。您可以通过以下方式获取 RAM 使用情况:

width*height*4 (for images with an alpha channel)

width*height*3 (for images without an alpha channel)

Android 应用程序在 RAM 中分配了一定数量的堆空间,这在特定设备和该设备上的 ROM 版本上总是相同的。最小为 16 MB,尽管如今大多数设备为您提供更舒适的 32 MB 或 64 MB。这真的取决于设备。

Out of Memory Exceptions当您的应用程序超出此堆空间时,您将获得(OOM)。简单的解决方法是:不要超过这个堆空间。

在您的应用中获取高质量图像的最佳方法是使用密度桶并提供不同的尺寸供 Android 选择。LDPI 屏幕无论如何都不能使用高分辨率图像,因此您应该只在 LDPI 中提供低分辨率。另一方面,HDPI 设备可以利用更好的分辨率,如果你提供一个 Android 设备就可以使用它。几乎可以肯定的是,设备的分辨率越高,分配给应用程序运行的堆空间就越多。

另一种管理内存的方法是只加载你需要的,通过实现延迟加载。这对于列表视图和滚动视图以及其他基于适配器的视图系统特别有用。

在 Android 3.0 及更高版本上,您可以使用android:largeHeap="true". 但是,应该避免这种情况,因为每当您的应用程序启动时,用户会注意到他们的其他应用程序从内存中删除,并且不能保证在任何情况下您都会收到更大的堆。

于 2013-08-18T21:32:26.713 回答