我需要在活动开始时出现“正在加载”progressdialog,然后在加载完成后显示一些内容。在我的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();
处理程序(未显示)显示我需要显示的所有内容,并且在加载数据时,progressdialog按预期显示。问题是,在eclipse中运行内存分析器后,我意识到每次访问此活动时,它都会在新线程中生成由处理程序创建的所有内容的新实例,而不会破坏前一个。由于活动的多个实例在多个线程中永远运行,我最终耗尽内存。
这是我不明白的地方。我的印象是,在上面的例子中,处理程序将在主ui线程中运行,而不是在包含对话框的新线程中运行。新线程中唯一应该存在的是progressdialog,对话框在处理程序的开头(未显示)立即被解除,这应该会停止线程,对吗?为什么这些线程被无限期地创建和运行?顺便说一下,我有“loadThread = false;”在我的onpause,ondestroy和onstop中试图在导航到另一个活动后停止该线程,但它不起作用。
如果我直接调用处理程序而不是在showdetailsThread finally {}中运行它,一切都很好并且没有泄漏,但我真的需要在加载期间发生的2秒延迟期间出现progressdialog。 p>
无论如何,可能有更好的方法。非常感谢任何帮助。
答案 0 :(得分:1)
现在没有更多内存泄漏。我需要在新线程中创建一个处理程序,它将绑定到Looper(介于Looper.prepare()和Looper.loop()之间:
threadKillerHandler = new Handler();
然后在我完成线程时调用looper的处理程序上的quit()(在我的情况下在onDestroy中):
threadKillerHandler.getLooper().quit();
否则线程将永远运行,并且每次用户重新访问活动时实例都会不断堆积。
答案 1 :(得分:0)
我建议使用AsynchTask
而不是你的方式。这将显示出现的多个实例。