Android内存泄漏:多个线程中的多个活动实例

时间:2011-02-26 00:09:25

标签: android multithreading memory memory-leaks

我需要在活动开始时出现“正在加载”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>

无论如何,可能有更好的方法。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

threadKillerHandler = new Handler();

然后在我完成线程时调用looper的处理程序上的quit()(在我的情况下在onDestroy中):

threadKillerHandler.getLooper().quit();

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

答案 1 :(得分:0)

我建议使用AsynchTask而不是你的方式。这将显示出现的多个实例。