Android:解包导致内存不足异常。如何检查对象?

标签 android parcelable

这是设置:

  • 我有一个包含项目列表的 Activity (从服务器更新,由普通 Java 类表示)。这些项目通过每行的自定义 BaseAdapter 和自定义 View 呈现。
  • 项目实现 Parcelable,因此当屏幕旋转时,项目作为 ParcelableArrayList 保存在包中,然后在不返回服务器的情况下恢复。

到目前为止,这是一个相当简单的设置,但我想将这些项目之一传递给另一个 Activity 。 Bundle 有一个“pubExtra(String, Parcelable)”方法,我想用它把对象放在那里,然后通过 Intent 传递。当我这样做时,由于 OutOfMemoryException,设备开始强制关闭。似乎在尝试解包对象时,它要求 ~30mb(!)

看起来该对象必须持有对其他对象的引用,因为该对象本身仅包含一些 int/float/String 字段和相关方法。我无法通过查看代码或调试检查器来追踪这一点,而且我不知道如何有效地使用堆查看器。

有什么建议吗?

这是堆栈跟踪

/dalvikvm-heap( 5876): Out of memory on a 29098436-byte allocation.
I/dalvikvm( 5876): "main" prio=5 tid=1 RUNNABLE
I/dalvikvm( 5876):   | group="main" sCount=0 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8
I/dalvikvm( 5876):   | sysTid=5876 nice=0 sched=0/0 cgrp=default handle=-1345017816
I/dalvikvm( 5876):   | schedstat=( 1107116708 1124999998 2626 )
I/dalvikvm( 5876):   at java.util.ArrayList.<init>(ArrayList.java:~84)
I/dalvikvm( 5876):   at android.os.Parcel.readArrayList(Parcel.java:1460)
I/dalvikvm( 5876):   at android.os.Parcel.readValue(Parcel.java:1792)
I/dalvikvm( 5876):   at android.os.Parcel.readMapInternal(Parcel.java:2007)
I/dalvikvm( 5876):   at android.os.Bundle.unparcel(Bundle.java:208)
I/dalvikvm( 5876):   at android.os.Bundle.containsKey(Bundle.java:249)
I/dalvikvm( 5876):   at <mypackage>.BaseDetailsActivity.isInModifyState(BaseDetailsActivity.java:184)
I/dalvikvm( 5876):   at <mypackage>.DetailsActivity.onCreate(DetailsActivity.java:230)
I/dalvikvm( 5876):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
I/dalvikvm( 5876):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
I/dalvikvm( 5876):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
I/dalvikvm( 5876):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
I/dalvikvm( 5876):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
I/dalvikvm( 5876):   at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm( 5876):   at android.os.Looper.loop(Looper.java:123)
I/dalvikvm( 5876):   at android.app.ActivityThread.main(ActivityThread.java:4627)
I/dalvikvm( 5876):   at java.lang.reflect.Method.invokeNative(Native Method)
I/dalvikvm( 5876):   at java.lang.reflect.Method.invoke(Method.java:521)
I/dalvikvm( 5876):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
I/dalvikvm( 5876):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
I/dalvikvm( 5876):   at dalvik.system.NativeStart.main(Native Method)

最佳答案

我遇到了同样的问题,归结为:我失误了,我的一个变量没有按正确的顺序写入。我认为 Parcelable 的工作水平非常低。

我的猜测是,在低级别上,它试图在错误的内存位置读取数组列表,并且它从未收到“停止读取!”的消息。信号。因此,它一直疯狂地读取,直到堆空间达到应用程序限制。 *我也猜你可能有/正在有类似的问题

底线:仔细检查您的 Parcelable 读取和写入函数,确保它们以相同的顺序读取/写入变量

  • 尽管很久以前就有人问过这个问题。我通过 Google 找到了这个页面,所以继续发布这个页面,以防其他人遇到同样的问题。

编辑:我也会推荐 elevine 的建议,我鼓励投票赞成。这实际上帮助我将范围缩小到 Parcel 对象中的 ArrayLists

关于Android:解包导致内存不足异常。如何检查对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3998828/

相关文章:

android - 多人游戏编程

android - 'adb forward tcp:8080 tcp:8080' 命令有什么作用?

java - Parcel//ArrayList 的问题

android - 将 Parcelable Arraylist 发送到 fragment

android - 在进程之间传递游标(Parcelable Cursor)

java - 解码parcelables的问题

android - 如何通过 Android Manifest 使我的 Android 应用全屏显示?

android - 无法在 android studio 中创建新 Activity

android - 如何无限次重复YoYo Animation Techniques?

android - 将复杂对象列表从 Activity 传递到 fragment