次のようなアクティビティがあります。
class MyActivity extends Activity {
Runnable refreshTimer = new Runnable() {
public void run() {
refresh();
}
};
protected onCreate(...) {
handler.postAtTime(refreshTimer, ...);
}
protected onDestroy() {
handler.removeCallbacks(refreshTimer);
}
protected void refresh() { ... }
}
onDestroyが呼び出された後も、何らかの理由でMyActivity $ 0(更新Runnable)への参照を含むメッセージがアクティビティのMessageQueueにあります。MyActivity $ 0にはMyActivityへの暗黙の参照があるため、これによりMyActivityコンテキストのメモリリークが発生します。
Eclipseメモリアナライザーツールを使用したファントム、ソフト、ウィークなどの参照を除くandroid.app.Activityのmerge_shortest_pathsの結果:
(上記のソースコードは、MATダンプに表示される実際のオブジェクト関係を簡略化したものです)
removeCallbacksを呼び出すと、実行可能なオブジェクトへの参照がキューから削除されるべきではありませんか?なぜコンテキストをリークしているのですか?