我需要一个“加载”进度对话框出现在活动的开始处,然后在加载完成后显示一些内容。在我的onResume,我有类似下面的代码:Android内存泄漏:多个线程中的多个活动实例
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中运行它,那么一切正常,没有泄漏,但我真的需要在加载期间发生的2秒延迟期间出现progressdialog。
无论如何可能有更好的方法来做到这一点。任何帮助是极大的赞赏。
。 FRO m内存,我不认为你需要每次启动新线程 - 进度对话框为你处理。 – flesh 2011-02-26 00:13:59
如果我只是在onresume的主UI线程中放置进度对话框,或者在数据加载之前进行了操作,则该对话框不会显示,因为ui线程正在忙于加载数据(即使progressdialog是第一个事件),并且时间它已完成加载,它已经有时间解除对话。屏幕只是几秒钟的空白,这正是我想要避免的。 – Tom 2011-02-26 00:20:26