2016-07-18 7 views
1

メモリモニタ(ウィンドウ6:AS内のAndroid Monitor/Monitors)からJavaヒープダンプを見ると、LoginActivityとLoginFragmentがまだメモリに残っていますログイン後の活動を開始するときに私のLoginActivityでactivity.finish()を呼び出しました。 LoginActivityはバックスタックにありません(バックボタンはログイン後のアクティビティからアプリケーションを閉じます)。なぜ、activity.finish()がメモリからクリアしなかったのですか?Android Studioのメモリモニタは、finish()後もまだアクティビティを示しています

  1. 活動はまだいくつかの他のオブジェクト
  2. それは

答えて

2

メモリがによってクリーンアップされて到達不能になったため、ガベージコレクタが実行されなかったから到達可能である:

+0

クイック返信ありがとう!それはガベージコレクションではないので、どこかの参照にする必要があります。私が "Analyzer Tasks"を実行すると、それは漏れのある活動だと言われています。それが開催されている場所を追跡するのに役立つツールはありますか? – chdryra

+0

私はそれを追跡し、代わりにactivity.getApplicationContext()を渡しました。ありがとう! – chdryra

0

は、潜在的に二つの理由がありますガベージコレクタは時々実行され、メモリから削除するために使用されなくなったオブジェクトを探します。ダンプの時点で、ガベージコレクタがまだ実行されていない可能性があります。モニターのメモリーセクションにある "Garbage Truck"アイコンを押すと、強制的に実行されます。

アクティビティへの参照が保持されている可能性もあります。そのため、ガベージコレクタは解放していない可能性があります。 「this」(アクティビティ)をコンテキストパラメータとしてメソッドに渡す場所を確認します。代わりに、Activity.getApplicationContext()を渡して、アプリケーション・コンテキスト(それはリサイクルされません)を渡しています。

+0

お返事ありがとうございます。私は "StartActivityForResult()"を使ってポストログイン活動を開始し、LoginActivity.finish()を実行しました(デフォルトではランチャークラスを使用しています)。 「StartActivity()」ではなく、前者を実行しても、起動アクティビティへの参照が密かに保持されますか? – chdryra

関連する問題