1

データに対して何らかの信号処理を実行しながら、記録されたファイルを再生できるようにする Android アプリを作成しています。

リストビューからファイルが選択されると、再生と処理が行われる新しいアクティビティが起動されます。onBackPressed メソッドで、finish を呼び出してアクティビティを終了し、ユーザーが別のファイルを選択できるリスト ビューに戻ります。

小さなファイルを数回選択するか、大きなファイルを 1 回選択する場合はすべて正常に機能しますが、大きなファイルを再度選択すると、OutOfMemoryError 例外がスローされます。

DDMS を使用してメモリ ヒープを確認しましたが、リスト ビューに戻ったときにアクティビティのメモリが解放されていないことは明らかです。ロードされているファイルのサイズに基づいて累積されます。

広範な調査にもかかわらず、メモリリークがどこから来ているのかわかりません。原因としてビットマップとコンテキストの参照を調べましたが、これらは問題ではないようです。マイクから取得したリアルタイムのオーディオを使用する別の同様のアクティビティがあるため、ファイルの読み込み自体も問題ではないようです。

1) メモリリークの原因は何ですか?

2) finish/ondestroy が呼び出されたときに、アクティビティのメモリが確実に解放されるようにするにはどうすればよいですか。

4

1 に答える 1