如果您必须使用(并保留)大量内存,那么是的,您可以并且应该使用android:largeHeap="true"
. 但是如果你确实使用它,你应该准备好让你的应用程序在其他应用程序处于前台时从内存中刷新。
“做好准备”是指您应该针对这种可能性进行设计,以便尽可能高效地编写您的方法onStop()
和方法,同时确保以向用户呈现无缝外观的方式保存和恢复所有相关状态。onResume()
有与此参数相关的三种方法:maxMemory()
、getMemoryClass()
和getLargeMemoryClass()
。
对于大多数设备,默认情况下maxMemory()
将表示一个相似getMemoryClass()
的值,尽管后者以兆字节表示,而前者以字节表示。
当您使用该largeHeap
参数时,maxMemory()
将增加到特定于设备的更高级别,而getMemoryClass()
将保持不变。
getMemoryClass()
不会限制您的堆大小,但它会告诉您如果您希望您的应用程序在您运行的特定设备的限制内舒适且兼容地运行,您应该使用的堆数量。
maxMemory()
相比之下,确实会限制您的堆大小,因此您确实可以通过增加其值来访问额外的堆,并且largeHeap
确实会增加该值。但是,增加的堆数量仍然是有限的,并且该限制将是特定于设备的,这意味着您的应用程序可用的堆数量会有所不同,具体取决于运行您的应用程序的设备的资源。因此,使用largeHeap
并不是让您的应用程序放弃所有谨慎并在自助餐中找到自己的方式。
largeHeap
您的应用程序可以通过调用方法使用参数来准确发现特定设备上可用的内存量getLargeMemoryClass()
。返回的值以兆字节为单位。
这篇较早的文章包括对该largeHeap
参数的讨论,以及一些示例,说明在几个特定的 Android 设备上使用和不使用它时可用的堆数量:
检测 Android 中的应用程序堆大小
我没有部署任何我自己的应用程序将此参数设置为 true。但是,我的一个应用程序中有一些内存密集型代码用于编译一组与优化相关的参数,这些参数仅在开发期间运行。我largeHeap
只在开发过程中添加参数,以避免在运行此代码时出现内存不足错误。但是我在部署应用程序之前删除了参数(和代码)。