2011-02-26 44 views
2

我需要一个“加载”进度对话框出现在活动的开始处,然后在加载完成后显示一些内容。在我的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。

无论如何可能有更好的方法来做到这一点。任何帮助是极大的赞赏。

+0

。 FRO m内存,我不认为你需要每次启动新线程 - 进度对话框为你处理。 – flesh 2011-02-26 00:13:59

+0

如果我只是在onresume的主UI线程中放置进度对话框,或者在数据加载之前进行了操作,则该对话框不会显示,因为ui线程正在忙于加载数据(即使progressdialog是第一个事件),并且时间它已完成加载,它已经有时间解除对话。屏幕只是几秒钟的空白,这正是我想要避免的。 – Tom 2011-02-26 00:20:26

回答

1

没有更多的内存泄漏了。我需要创建新的线程中的处理程序,它会结合到弯针(Looper.prepare介于()和Looper.loop():

threadKillerHandler = new Handler();

然后调用退出()上弯针的当我(在我的案件中的onDestroy)与线程中完成的处理程序:

threadKillerHandler.getLooper().quit();

否则线程将一直运行下去,和实例将保持每一个用户再次访问该活动时间堆砌