在Android应用程序中,我在单独的线程中运行任务。线程运行时,它将在主窗口中更新进度条,以使用户知道发生了什么。问题是,如果用户第二次启动线程,进度条将不会被重置。它不会做任何事情而只是100%坐着。

整个来源是available on github。以BackupThread为例
JsonBackup(主类)。请注意,“RestoreThread”显示相同的行为,但是我认为在两种情况下,问题都是相同的。

快速浏览:

line 300 in JsonBackup.java附近,我打开一个新的ProgressDialog。由于这是一个新实例,因此我假设所有操作均已正确初始化。在当前的工作副本上,我添加了一行,将进度设置为“0”,但这并没有任何改变。在同一块中,创建备份线程并运行它。

下一个感兴趣的代码是线程将其进度传达回主应用程序的时刻。这发生在line 185 of BackupThread.java周围。

该消息在line 80 of JsonBackup.java中处理,它将更新进度栏。

到目前为止,有关代码的演练。撰写本文时令我震惊的一件事是line 87 of JsonBackup.java。我认为最好是线程发送不同的消息,明确指出已完成。但是我认为这不是真正的问题。我之所以这样说,是因为进度对话框一旦达到100%便会正确关闭。

因此,如果整个过程运行一次,那么一切都会按预期进行。现在假设用户离开了应用程序,但是操作系统决定将其加载到内存中。稍后,用户回来并想要创建一个新的备份。然后,该应用程序将无法工作,因为进度会以100%的速度挂起。如果您终止了该应用程序,则将其完全卸载,它将再次运行。因此,我假设某些对象实例仍在内存中,并且在重新运行时处于不干净状态。但是对于我的一生,我无法找到正在发生的事情。作为切线,我可能要补充:除了记事本教程,这是我的第一个Android应用程序,等等...

我在这里想念什么...?

最佳答案

DialogActivity缓存,这是预期的行为。
选项有:

  • 覆盖onPrepareDialog(..)以重置其状态
  • 在再次显示
  • 之前先调用removeDialog(..)
  • 自己管理对话框,手动调用show()dismiss()

  • 我通常将#1用于常用的Dialog,将#3用于罕见的ojit_code。

    10-08 03:42