2011-10-27 13 views
0

私のアプリには無限の活動スタックを持つ能力があります。このシナリオでは、あるユーザーのページから開始し、そのユーザーの「友人」であるユーザーの一覧が表示されます。その後、私は大きな問題が...ちょうどあなたがそのように上の自分のページに移動するには、別の友人をクリックし、できる前のもの、のように見える自分のページに行くために友人に無限の活動計画

をクリックすることができます面は無限のネイティブヒープです。私はビューが膨らんだたびにこのヒープに追加すると信じています。これを数回繰り返した後、私は一貫してOOMエラーが発生するため、何らかの解決方法を見つけなければなりません。トリックは、私はいくつかの歴史をナビゲートするための最小限の最後のいくつかの活動を維持したいです。

私が思いつくことは、アクティビティスタックを監視して、特定のポイントに達するとアクティビティを終了することです。それは堅実なアプローチのように聞こえるのでしょうか、それとも誰かが私にそのアプローチや別のアプローチの実装を指摘することはできますか?

おかげ

編集:

スタックは非常に簡単です。リスト(友人)をクリックし、そのページに移動します。これは、通常のstartActivity呼び出しを使用して、同じページへのインテントと、ユーザーIDを持つインテントを追加し、データベースまたはリモートAPIコールを呼び出してユーザーのデータを取得します。また

は、私は日常私のナビゲーション中meminfoのダンプをチェックしています、ネイティブ対のDalvikについてフォローアップします。私は、dalvikヒープを可能な限り小さく保ち、onStopでリソースをクリーンアップしています。ネイティブヒープははるかに速く成長します。私はどこでもビットマップへのハードリファレンスはありませんが、膨らみから画面上にかなりのドロアブルがあります。これらのドロアブルは、アンドロイドが私の活動を最終的に殺すようになるのでしょうか?私の活動が予防的に破壊されることなく、彼らがOOMにつながると私は最高に感じる。

私が理想的であること、手動で私の活動を破壊するだけではなく、それらを停止する(Androidは時にメモリ不足に行うことを主張したように)、および状態を保存してスタックに破壊活動を続けることができれば。再び

編集:

別のキーは、これらの活動は、例えば、それらと混合その他の活動を持っているということです

ユーザー - >ユーザー - >活動 - >ユーザー - >活動のB - 私はスタックに建てを利用したい理由>ユーザー

はそのためですので、私はに行かなければならないとき、私は知っていますユーザーの活動と私がしないとき。

+0

正確にどのようにあなたはユーザーページのあなたの「スタック」を実装していますか? – josephus

答えて

0

発生しているOOMの問題は、開いているアクティビティの数に関係しているとは思われません。 Androidは、メモリ使用量が増えるほど、バックグラウンドで古いアクティビティを破壊するはずです。これらのアクティビティは、ユーザーがタスクスタックに戻ったときに再作成されます。

MAT(メモリアナライザツール)のようなツールを使用して、アプリケーションの実行時に割り当てた内容を確認しましたか。私は、あなたがメモリリークを持っている可能性があります、またはあなたのメモリ割り当てでよりスマートにする必要があるかもしれないと思う。

+0

私はMATを使用しており、リソースの解放についてもかなり注意しています。ネイバーとダルビクの両方が上に行くほど、meminfoダンプを見ることができます。ネイティブヒープ問題のためにシステムがアクティビティを終了させますか?私はそれが別々だと思った... –

+0

GCが実行されるまで、ネイティブとdalvikの両方が上がると思う。あなたのメモリのほとんどがネイティブ側に割り当てられている場合、私はDalvikがそれに反応しないというあなたの仮定に正しいと思います。ネイティブ側で大部分の作業をしているようです。スタック内の次のアクティビティに移動するときにonStopがアクティビティに対して呼び出される必要があるため、クリーンアップが適切に機能しているかどうか確認してください。 –

+0

私のクリーンアップは機能していますが、十分に徹底していない可能性があります。私はリストをクリアし、行を取り除くためにリサイクルビンを一覧表示しますが、他のビューはそのままです。つまり、リストの外にあるすべてのものがそのドロアブル(ボタン、背景、ヘッダーイメージなど)を保持します。私はこれがネイティブヒープがちょうどそこに座っているこれらのドロアブルを膨らませるたびに上昇し続ける理由だと思う。だから、私はそれを見ているように私はすべての私の意見を殺す(過剰殺戮のように思える)か、私の活動の大きさを規制しなければならない。私の元々のヒープに何があったのか分かると、私はもっと自信があります。 –

1

このアクティビティの作成方法については、singleInstance、KeyEventを傍受してください。KEYCODE_BACKは、私はここにいくつかの例を作ったこの活動

のために自身のバックボタンスタックを構築:

http://esilo.pl/selvin/endlessactivity.zip

+0

良いアイデア(とそのためのupvote)しかし、私のニーズはもう少し複雑です。私が言及しなかったのは、これらのアクティビティに他のアクティビティが混在していることです。上に編集して、 –

+0

(同じソースから)新しいバージョンをダウンロードしたことを反映しています... 'setIntent(intent);'を 'public void onNewIntent(インテントインテント) '(あなたがオリエンテーションを変更してもバックスタックが失われることはありません) – Selvin

関連する問題