【发布时间】:2011-02-20 13:20:47
【问题描述】:
在 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 应用程序,并且 bla di blah blah...
我在这里错过了什么......?
【问题讨论】:
-
只是为了给像我这样的人解释更多,如果您在Asynctask中使用进度条,您可以在onPostExecute函数上将进度对话框的Progress设置为零以供下次使用。
标签: android multithreading progress-bar