gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:17:47 26 4
gpt4 key购买 nike

我有一个如下所示的 Activity :

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 后,由于某种原因,在 Activity 的 MessageQueue 中仍然有消息包含对 MyActivity$0(刷新 Runnable)的引用。因为 MyActivity$0 隐式引用了 MyActivity,这会导致 MyActivity 上下文发生内存泄漏。

使用 Eclipse 内存分析器工具对 android.app.Activity 的 merge_shortest_paths 结果排除了 phantom、soft、weak 等引用: enter image description here

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

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

最佳答案

尝试一下:

根据安卓文档:

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

当您退出 Activity 时,看起来仍然有一堆排队的消息,并且取消注册的上下文没有调用取消回调。

您应该做的是在 onPause 中注销您的可运行对象:此回调主要用于保存 Activity 正在编辑的任何持久状态,向用户呈现“就地编辑”模型,并确保如果没有足够的资源来启动新 Activity 而不先终止此 Activity,则不会丢失任何内容。这也是执行停止动画和其他消耗大量 CPU 的事情的好地方,以便尽可能快地切换到下一个 Activity ,或者关闭独占访问的资源,例如相机。

通常一个 Receiver 或“Scheduled”Runnable 将在 onResume 中注册,并在 onPause 中注销以获得更好的生命周期配对

如果没有看到您在刷新中做了什么,很难判断,它可能由于刷新方法中引用的 Activity 范围内的 Activity 引用而泄漏。

关于android - android.os.Message 和/或 Handler.removeCallback 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com