在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应用程序,等等...
我在这里想念什么...?
最佳答案
Dialog
被Activity
缓存,这是预期的行为。
选项有:
onPrepareDialog(..)
以重置其状态removeDialog(..)
show()
,dismiss()
我通常将#1用于常用的
Dialog
,将#3用于罕见的ojit_code。