Snapshots.commitAndClose中的OutOfMemoryError

时间:2015-07-25 21:30:11

标签: android google-play-services

我创建了一款可以从Google Play商店下载的Android应用。我通过以下堆栈跟踪获取报告:

java.lang.OutOfMemoryError
java.nio.ByteBuffer.allocate(ByteBuffer.java:56)
com.google.android.gms.common.data.BitmapTeleporter.writeToParcel(Unknown Source)
com.google.android.gms.common.internal.safeparcel.zzb.zza(Unknown Source)
com.google.android.gms.games.snapshot.SnapshotMetadataChangeCreator.zza(Unknown Source)
com.google.android.gms.games.snapshot.SnapshotMetadataChangeEntity.writeToParcel(Unknown Source)
com.google.android.gms.games.internal.IGamesService$Stub$Proxy.zza(Unknown Source)
com.google.android.gms.games.internal.GamesClientImpl.zza(Unknown Source)
com.google.android.gms.games.internal.api.SnapshotsImpl$3.zza(Unknown Source)
com.google.android.gms.games.internal.api.SnapshotsImpl$3.zza(Unknown Source)
com.google.android.gms.common.api.zza$zza.zzb(Unknown Source)
com.google.android.gms.common.api.zzd.zza(Unknown Source)
com.google.android.gms.common.api.zzd.zzb(Unknown Source)
com.google.android.gms.common.api.zzg.zzb(Unknown Source)
com.google.android.gms.games.internal.api.SnapshotsImpl.commitAndClose(Unknown Source)
com.peerkesoftware.blockcrusher.data.savegame.SaveGameManager.save(SaveGameManager.java:176)
com.peerkesoftware.blockcrusher.data.savegame.SaveGame.save(SaveGame.java:25)
com.peerkesoftware.blockcrusher.fragments.GameFragment.sendScoreToServer(GameFragment.java:309)
com.peerkesoftware.blockcrusher.fragments.GameFragment.onGameOver(GameFragment.java:260)
com.peerkesoftware.blockcrusher.controls.GameBoard2$1.run(GameBoard2.java:220)
android.os.Handler.handleCallback(Handler.java:733)
android.os.Handler.dispatchMessage(Handler.java:95)
android.os.Looper.loop(Looper.java:157)
android.app.ActivityThread.main(ActivityThread.java:5293)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
dalvik.system.NativeStart.main(Native Method)

据我所知,它只发生在三星Galaxy Note3(T-Mobile)SM-N900T设备上。但是该设备应该有足够的内存。谁知道我为什么会收到这个错误?以及如何预防?

2 个答案:

答案 0 :(得分:0)

内存不足异常适用于您的应用,而非设备。依赖于设备的是您的应用程序允许使用多少内存。对于特定设备,三星可能会设置一个下限。请记住,您的位图需要设备具有更多ram的租用分辨率。

您可以看到您的应用可以使用多少内存:

final int maxRamKiB = Runtime.getRuntime().maxMemory() / 1024;

要知道你有多少这样的自由:

final int freeRamKiB = Runtime.getRuntime().freeMemory() / 1024;

在保存游戏之前,你可以查看你有多少免费ram,如果它太少,你可以在开始保存操作之前释放一些。公羊的可能候选人是位图。

这是一个很好的开始,可以更准确地调查您的应用如何使用其内存: https://developer.android.com/intl/es/tools/debugging/debugging-memory.html

答案 1 :(得分:0)

您可以通过

来要求更大的内存大小
android:largeHeap="true"

在您的Android清单中。

在使用此方法之前,请考虑以下引用:

  

但是,请求大堆的功能仅适用于一小部分可以证明需要消耗更多RAM的应用程序(例如大型照片编辑应用程序)。永远不要仅仅因为你的内存耗尽而需要快速修复而请求大堆 - 只有当你确切知道所有内存的分配位置以及必须保留它的原因时才应该使用它。然而,即使您确信您的应用程序可以证明大堆的合理性,您也应该尽可能避免请求它。使用额外的内存将越来越不利于整体用户体验,因为在任务切换或执行其他常见操作时,垃圾收集将花费更长时间并且系统性能可能会更慢。

自: https://developer.android.com/intl/es/training/articles/memory.html