我有一个如下所示的活动:
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 后,由于某种原因,活动的 MessageQueue 中仍有消息包含对 MyActivity$0(刷新 Runnable)的引用。因为 MyActivity$0 具有对 MyActivity 的隐式引用,这会导致 MyActivity 上下文的内存泄漏。
android.app.Activity 的 merge_shortest_paths 的结果,不包括使用 Eclipse Memory Analyzer Tool 的 phantom、soft、weak 等引用:
(上面的源代码是对MAT转储中显示的实际对象关系的简化)
不应该调用 removeCallbacks 从队列中删除对可运行对象的任何引用吗?为什么我要泄露上下文?