gpt4 book ai didi

Android 内存泄漏 : Multiple instances of activity in multiple threads

转载 作者:行者123 更新时间:2023-11-29 02:14:30 26 4
gpt4 key购买 nike

我需要在 Activity 开始时显示“正在加载”进度对话框,然后在加载完成后显示一些内容。在我的 onresume 中,我有类似这样的代码:

loadThread = true;

Thread showDetailsThread = new Thread() {
@Override
public void run() {

while (loadThread == true) {

Looper.prepare();

try {
dialog = ProgressDialog.show(myactivity.this, "", "Loading data...", true);

} finally {

handler.sendEmptyMessage(0);

}

Looper.loop();

}

}}; showDetailsThread.start();

处理程序(未显示)显示我需要显示的所有内容,并且在加载数据时,进度对话框按预期显示。问题是,在 eclipse 中运行内存分析器后,我意识到每次访问此 Activity 时,它都会在新线程中生成由处理程序创建的所有内容的新实例,而不会破坏前一个。由于 Activity 的多个实例在多个线程中永远运行,我最终耗尽了内存。

这是我不明白的地方。我的印象是,鉴于上面的示例,处理程序将在主 ui 线程中运行,而不是在包含对话框的新线程中运行。新线程中唯一应该存在的是进度对话框,对话框在处理程序开始时立即关闭(未显示),这应该会停止线程,对吧?为什么要无限期地创建和运行这些线程?顺便说一句,我有“loadThread = false;”在我的 onpause、ondestroy 和 onstop 中试图在导航到另一个 Activity 后停止线程,但它不起作用。

如果我只是直接调用处理程序而不是在 showdetailsThread finally{} 中运行它,一切都很好并且没有泄漏,但我确实需要在加载过程中发生的 2 秒延迟期间出现进度对话框。

无论如何,可能有更好的方法来做到这一点。非常感谢任何帮助。

最佳答案

现在没有更多的内存泄漏。我需要在新线程中创建一个处理程序,它将绑定(bind)到 Looper(在 Looper.prepare() 和 Looper.loop() 之间的某处):

threadKillerHandler = new Handler();

然后当我完成线程(在我的例子中是在 onDestroy 中)时,在循环程序的处理程序上调用 quit() :

threadKillerHandler.getLooper().quit();

否则线程将永远运行,并且每次用户重新访问 Activity 时实例都会不断堆积。

关于Android 内存泄漏 : Multiple instances of activity in multiple threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124089/

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