来自XML的Android致命信号11

来自XML的Android致命信号11,android,image,runtime,Android,Image,Runtime,我正在创建一个Android应用程序,直到现在我还没有用完内存。令人困惑的是,这并不是我期望的内存耗尽的方式 我只是在布局xml文件中添加了一个新的线性布局。它有一个40kb大的图像背景。加载的其他图像约为12kb,背景更大,为120kb。加载此映像时,我将在运行时收到致命信号11。如果我从布局中删除背景,它会工作得很好。然后我把图像改小了很多,以前是(2000x600),现在是14kb。它现在运行良好。很明显,额外的26kb导致了一个问题 我应该采取什么样的预防措施来确保这种情况不再发生。很明

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

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

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

是否有可以扩展的内存使用上限,或者我应该保持在该上限之下?此外,如果我在scrollview上加载了许多图像,这会导致应用程序崩溃吗?我曾经一次加载了许多图像,但以前从未让它崩溃过,我只是对由于很少使用内存而导致的错误感到困惑。(至少以今天的术语来说。)

问候,


Jake

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

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

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

当您的应用程序超出此堆空间时,会出现内存不足异常。简单的解决方法是:不要超过这个堆空间

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

另一种管理内存的方法是通过实现延迟加载,只加载您需要的内容。这对于ListView和ScrollView以及其他基于适配器的视图系统尤其有用


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

我正在通过runtime.getRuntime().getFreeMemory等获取我正在运行的应用程序的使用百分比。。。大约75%。我发现,当我清除缓存或删除应用程序的背景图像时,它实际上会占用更多内存,即使内存量很小,比如4kb左右。。应用程序应该占用那么多吗?
width*height*3 (for images without an alpha channel)