【发布时间】:2011-02-26 00:09:25
【问题描述】:
我需要在活动开始时出现“加载”进度对话框,然后在加载完成后显示一些内容。在我的简历中,我有类似这样的代码:
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 中运行内存分析器后,我意识到每次访问此活动时,它都会在新线程中生成由处理程序创建的所有内容的新实例,而不会破坏前一个。由于活动的多个实例在多个线程中永远运行,我最终耗尽了内存。
这是我不明白的。我的印象是,鉴于上面的例子,处理程序将在主 ui 线程中运行,而不是在包含对话框的新线程中。新线程中唯一应该存在的是进度对话框,并且对话框在处理程序(未显示)的开头立即关闭,这应该停止线程,对吗?为什么这些线程被创建并无限期地运行?顺便说一句,我有“loadThread = false;”在我的 onpause、ondestroy 和 onstop 中,试图在导航到另一个活动后停止线程,但它不起作用。
如果我只是直接调用处理程序而不是在 showdetailsThread finally{} 中运行它,一切都很好并且没有泄漏,但我确实需要在加载过程中发生的 2 秒延迟期间出现进度对话框。
无论如何,可能有更好的方法来做到这一点。非常感谢任何帮助。
【问题讨论】:
-
根据记忆,我认为您不需要每次都启动新线程 - 进度对话框会为您处理。
-
如果我只是将progressdialog放在onresume的主ui线程中或在数据加载之前,对话框永远不会显示,因为ui线程正忙于加载数据(即使progressdialog是第一个事件),并且当它完成加载时,它已经是时候关闭对话框了。屏幕只有几秒钟的空白,这是我试图避免的。
标签: android multithreading memory memory-leaks