5

設定は次のとおりです。

  • アイテムのリストを含むアクティビティがあります(サーバーから更新され、プレーンなJavaクラスで表されます)。アイテムは、各行のカスタムBaseAdapterおよびカスタムビューを介してレンダリングされます。
  • アイテムはParcelableを実装しているため、画面を回転させると、アイテムはParcelableArrayListとしてバンドルに保存され、サーバーに戻らずに復元されます。

これまでのところ、これはかなり簡単な設定ですが、これらの項目の1つを別のアクティビティに渡したいと思います。バンドルには「pubExtra(String、Parcelable)」メソッドがあり、これを使用してオブジェクトをそこに配置し、インテントを介して渡します。これを行うと、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)
4

2 に答える 2

15

私はこれに要約される同じ問題を抱えていました: 私は失敗し、変数の 1 つが正しい順序で書き込まれませんでした。Parcelable は非常に低いレベルで機能すると思います。

私の推測では、低レベルでは、間違ったメモリ位置で配列リストを読み取ろうとしたため、「読み取りを停止してください!」というメッセージが表示されませんでした。信号。そのため、ヒープスペースがアプリの制限に達するまで、狂ったように読み続けました。*また、おそらく同様の問題を抱えている/抱えていると思います

結論: Parcelable の読み取り関数と書き込み関数を再確認し、同じ順序で変数の読み取り/書き込みを行っていることを確認します。

  • これはかなり前に尋ねられましたが。Google 経由でこのページを見つけたので、他の誰かが同じ問題に遭遇した場合に備えて投稿しました。

編集:エレバインの提案もお勧めします。投票することをお勧めします。これは実際に、Parcel オブジェクトの ArrayLists に絞り込むのに役立ちました

于 2012-07-13T17:21:41.500 に答える
5

Eclipse Memory Analyzer Toolを使用してみてください。Eclipse へのプラグインとしてインストールし、DDMS の [Dump Hprof file] ボタンを使用します ([デバイス] タブにある下向き矢印の付いた緑色の円柱のように見えます)。あなたの記憶を調べます。

コードの一部を投稿すると、誰かが問題を見つけることもできます。

于 2010-10-22T17:19:29.037 に答える