如果你必须使用(并保留)大量内存,则可以且应该使用android:largeHeap="true"
。但是,如果您使用它,您应该准备好在其他应用程序处于前台时将您的应用程序从内存中清除。
“做好准备”意味着您应设计考虑到这种可能性,以便您的onStop()
和onResume()
方法尽可能高效地编写,同时确保以呈现对用户无缝外观的方式保存和恢复所有相关状态。
与此参数相关的有三种方法:maxMemory()
、getMemoryClass()
和getLargeMemoryClass()
。
对于大多数设备,默认情况下maxMemory()
将代表与getMemoryClass()
类似的值,尽管前者用字节表示,而后者用兆字节表示。
当您使用largeHeap
参数时,maxMemory()
将增加到特定于设备的更高级别,而getMemoryClass()
将保持不变。
getMemoryClass()
不限制您的堆大小,但它告诉您,如果您希望您的应用程序在运行的特定设备的限制范围内舒适地和兼容地运行,则应使用多少堆。
与之相比,
maxMemory()
确实限制了堆的大小,因此通过增加其值,您可以获得额外的堆访问权限,而
largeHeap
也确实增加了该值。然而,增加的堆量仍然是有限的,并且该限制将是设备特定的,这意味着您的应用程序可用的堆量会因运行应用程序的设备的资源而异。因此,使用
largeHeap
不意味着您的应用程序可以肆无忌惮地在自助餐厅里进食。
您的应用程序可以通过调用方法
getLargeMemoryClass()
来发现在特定设备上使用
largeHeap
参数将提供多少内存。返回的值以兆字节为单位。
这篇早期文章包括对
largeHeap
参数的讨论,以及关于在几个特定的 Android 设备上使用和不使用它所提供的堆数量的许多示例:
Detect application heap size in Android我从未将此参数设置为true来部署我的任何应用程序。 但是,在我的一款应用程序中,有一些占用内存较多的代码用于编译一组优化相关的参数,仅在开发期间运行。我仅在开发期间添加largeHeap
参数,以避免在运行此代码时出现内存不足错误。但在部署应用程序之前,我会删除该参数(和代码)。