0

私はかなり複雑なアプリを持っています-

UIアクティビティは、サービスを起動し、2ウェイAIDLコールバックを設定して、2つが通信できるようにします。

サービスは永久に実行されます(UIアクティビティの[オフ]ボタンを押さない限り)。

問題は、ユーザーがアクティビティを終了するときに、アクティビティメモリが解放されないことです。-UIアクティビティを閉じても、アプリで使用されるメモリの量は同じです。-UIアクティビティが閉じられている場合でも、ヒープにはmapTilesやその他のUIがらくたが表示されます。

だから私の推測では、サービスはどういうわけかアクティビティへの参照を保持しています。アクティビティコンテキストのリークについて警告する多くの記事を知っています。サービスは、アプリケーションスコープに格納されている弱参照を介してのみアクティビティを参照します。(アプリケーションを拡張するクラス)

アクティビティを具体的に参照しているものを見つける方法はありますか?ドミネーターツリーには、すべてのメモリを消費しているmapTilesとListViewのレイアウトが表示されます...しかし、そのようなものを存続させているアクティビティへの参照が見つかりません。

また、OutOfMemoryExceptionが発生した場合にHPROFヒープダンプをダンプする方法はありますか?

4

2 に答える 2

0

問題は、ユーザーがアクティビティを終了するときに、アクティビティメモリが解放されないことです。

Androidには「出口アクティビティ」はありません。finish()を呼び出したり、アクティビティを押し戻したりしても、アクティビティが使用したオブジェクトはメモリから削除されません。Androidは本質的に、将来のランダムな時点でこれ自体を処理します。

アクティビティの終了時にオブジェクトをメモリから解放する場合は、手動でオブジェクトを解放する必要があります。

編集:メモリ使用量を見つけるために使用できるクラスはActivityManagerです。

于 2011-01-28T00:38:40.987 に答える
0

参照を保持しているのが自分ではない場合(「アプリケーションスコープに格納されている弱い参照を介してアクティビティを参照する」場合、それをnullにしますか?サービスでアクティビティを参照するのはなぜですか?通常はその逆です)、試してみましたかGCを実行するには?十分なメモリが残っている限り、ゴミ箱を移動するためのgcは実行されません。

于 2011-01-28T00:39:04.997 に答える