我正在创建一个Android应用程序,直到现在我还没有耗尽内存。令人困惑的是,这并不是我所期望的耗尽内存的方式。
我只是在布局xml文件中添加了一个新的线性布局。它的背景是一张40kb大的图像。加载的其他图像大小约为12kb,背景大得多,为120kb。当这个镜像被加载时,我会在运行时收到一个致命信号11。如果我从布局中删除背景,它会工作得很好。然后我将图像改小了很多,之前是(2000x600),所以现在是14kb。现在它工作得很好。很明显,额外的26kb导致了一个问题……
我应该采取什么样的预防措施来确保这种情况不会再次发生。显然,我想要高质量的图像,而2000x600可能太多了,因为它是一款手机应用程序,但我应该遵循什么准则呢?
有没有一个内存使用上限,可以延长,或者我应该看起来保持在下面?另外,如果我在滚动视图上加载了很多图片,会不会导致应用程序崩溃?我一次加载了很多图像,但以前从来没有崩溃过,我只是对内存使用量很少导致的错误感到困惑。(至少在今天是这样。)
致以敬意,
杰克
发布于 2013-08-19 05:32:27
映像在RAM中消耗的内存量与在磁盘上消耗的内存量不同。您可以通过以下方式获取RAM使用率:
width*height*4 (for images with an alpha channel)和
width*height*3 (for images without an alpha channel)Android应用程序在RAM中分配了一定数量的堆空间,在特定设备上的堆空间和该设备上的ROM版本总是相同的。最小为16MB,不过现在大多数设备都会给你32MB或64MB的内存。这真的取决于设备。
当你的应用程序超过这个堆空间时,你会得到Out of Memory Exceptions (OOMs)。简单的解决方法是:不要超过这个堆空间。
在你的应用程序中获得高质量图像的最好方法是使用密度桶,并提供不同的大小供Android选择。LDPI屏幕无论如何都不能使用高分辨率图像,因此您应该只在LDPI中提供低分辨率。另一方面,HDPI设备可以利用更好的分辨率,如果你提供一个Android就可以使用它。几乎可以肯定的是,设备的分辨率越高,分配给您的应用程序运行的堆空间就越多。
管理内存的另一种方法是通过实现延迟加载,只加载您需要的内容。这对列表视图和滚动视图以及其他基于适配器的视图系统特别有帮助。
在Android3.0及更高版本上,您可以使用android:largeHeap="true"请求更大的堆。然而,这应该被避免,因为当你的应用程序启动时,用户会注意到他们的其他应用程序被从内存中删除,并且不能保证你在任何情况下都会收到更大的堆。
https://stackoverflow.com/questions/18303844
复制相似问题