如果单个应用程序只能使用32mb堆,为什么Android设备需要1或2GB RAM?我无法将大图像加载到RAM中,例如3000x3000(仅为34mb)。
答案 0 :(得分:1)
可用,here,在Android文档中,使用
android:largeHeap="true"
允许您使用更大的堆大小,但建议您在可能的情况下使用较小的图像。
是否应该使用大型创建应用程序的进程 达尔维克堆。这适用于为此创建的所有进程 应用。它只适用于第一个加载到的应用程序 处理;如果您使用共享用户ID来允许多个 要使用进程的应用程序,它们都必须使用此选项 一直或他们将有不可预测的结果。大多数应用应该 不需要这个,而应该专注于减少他们的整体 内存使用以提高性能。启用此功能也不会 保证固定增加可用内存,因为有些设备 受到总可用内存的限制。
要在运行时查询可用内存大小,请使用这些方法 getMemoryClass()或getLargeMemoryClass()。
答案 1 :(得分:0)
是的,这是真的。有些人可能会认为这在开发Android应用程序时是一个最大的挑战,特别是那些需要加载大型图像的应用程序。
解决此问题的最佳方法是在使用Android应用程序时简单地接受此限制,并在创建Bitmaps时非常小心。原则上,内存中永远不会有比一次在屏幕上显示的位图更多的位图。这意味着加载较小的位图,并回收不再使用的位图。
但有时候,你需要同时持有大量的位图,这个数量超出了每个应用程序的内存限制。
为此,也许最好的选择是将这些位图渲染为OpenGL-ES纹理。
在Android中使用OpenGL-ES时,纹理(实际上是Bitmaps的OpenGL名称)保存在设备的堆上,并且不受与普通位图相同的内存限制。在这里,您可以充分利用设备RAM。
对于开发人员来说,OpenGL-ES被认为是一个稍微“高级”的主题,但是如果你按照this one这样的一些教程,你可以很快地设置一些基础知识。
最后,您还可以在清单文件new Buffer('Laurence Tureaud is Mr. T').toString('base64');
TGF1cmVuY2UgVHVyZWF1ZCBpcyBNci4gVA==
中进行定义。这将为您的应用程序分配更多的内存,但最终,您将遇到与以前相同的问题 - 无法访问完整的设备内存。如果你只需要更多的内存,这是一个很好的修复,但如果你的内存需求非常大,那么它可能是不够的。