android.os.Message和/或Handler.removeCallback中存在内存泄漏?

android.os.Message和/或Handler.removeCallback中存在内存泄漏?,android,Android,我的活动如下所示: class MyActivity extends Activity { Runnable refreshTimer = new Runnable() { public void run() { refresh(); } }; protected onCreate(...) { handler.postAtTime(refreshTimer, ...); } pr

我的活动如下所示:

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(刷新可运行)的引用。因为MyActivity$0具有对MyActivity的隐式引用,这会导致MyActivity上下文的内存泄漏

使用Eclipse内存分析器工具对android.app.Activity(不包括幻影、软、弱等引用)进行合并最短路径的结果:

(上面的源代码简化了MAT dump中显示的实际对象关系)

调用removeCallbacks是否应该从队列中删除对可运行对象的任何引用?我为什么泄漏上下文?

要尝试的内容:

根据android文档:

: 在您的活动被销毁之前,您收到的最后一个呼叫。这可能是因为活动正在完成(有人对其调用finish()),或者是因为系统正在临时销毁此活动实例以节省空间。可以使用isFinishing()方法区分这两种情况

当您退出活动时,看起来仍然有一堆排队的消息,用于取消注册的上下文没有调用cancel回调

您应该做的是在以下位置注销您的runnable: 此回调主要用于保存活动正在编辑的任何持久状态,以显示“原地编辑”为用户建模,确保没有足够的资源启动新活动而不首先终止此活动时不会丢失任何东西。这也是一个很好的地方,可以停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或关闭资源是独占访问的设备,如照相机

通常,接收器或“预定”Runnable将在onResume中注册,并在onPause中注销,以实现更好的生命周期配对

如果看不到您在refresh中正在做什么,很难判断,它可能是由于refresh方法中引用的活动范围内的活动引用而泄漏的