【问题标题】:Android Memory Leak: Multiple instances of activity in multiple threadsAndroid内存泄漏:多个线程中的多个活动实例
【发布时间】: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


【解决方案1】:

现在不再有内存泄漏。我需要在新线程中创建一个处理程序,它将绑定到 Looper(位于 Looper.prepare() 和 Looper.loop() 之间的某个位置:

threadKillerHandler = new Handler();

当我处理完线程后(在我的例子中是 onDestroy),然后在 looper 的处理程序上调用 quit():

threadKillerHandler.getLooper().quit();

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

【讨论】:

    【解决方案2】:

    我建议使用AsynchTask 而不是您的操作方式。这将优先显示多个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2020-07-21
      • 2012-05-25
      • 1970-01-01
      • 2017-08-08
      • 2017-02-04
      • 2012-05-06
      相关资源
      最近更新 更多