Android:unparceling导致内存不足异常。如何检查物体?

时间:2010-10-22 16:19:35

标签: android parcelable

以下是设置:

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

到目前为止,这是一个相当简单的设置,但我想将其中一个项目传递给另一个活动。 Bundle有一个“pubExtra(String,Parcelable)”方法,我想用它将对象放在那里,然后通过intent传递。当我这样做时,由于OutOfMemoryException,设备开始关闭一个力。似乎在试图取消对象时,它要求~30mb(!)

似乎对象必须保持对其他内容的引用,因为对象本身只包含一些int / float / String字段和相关方法。我无法通过查看代码或调试检查器来跟踪它,我不知道如何有效地使用Heap查看器。

有什么建议吗?

这是stacktrace

/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)

2 个答案:

答案 0 :(得分:14)

我有同样的问题归结为:我滑倒了,我的一个变量没有以正确的顺序写出来。我认为Parcelable的工作水平非常低。

我的猜测是,在低级别,它试图在错误的记忆位置读取一个arraylist,它从未得到“停止阅读!”信号。所以,在Heap Space达到app限制之前,它一直在疯狂阅读。 *我也猜测你可能有类似的问题

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

  • 即使这是很久以前的问题。我通过谷歌发现了这个页面,所以继续发布,以防万一其他人遇到同样的问题。

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

答案 1 :(得分:5)

您应该尝试使用Eclipse Memory Analyzer Tool。将它作为插件安装到Eclipse中,然后使用DDMS中的“Dump Hprof文件”按钮(看起来像设备选项卡上带有向下箭头的绿色圆柱体)。安装MAT后,Eclipse应该只启动它一些视图检查你的记忆。

如果您发布了一些代码,那么也有人可能会发现问题。