【问题标题】:ProgressBar does not reset to "0" when opening the second time第二次打开时ProgressBar不会重置为“0”
【发布时间】: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


【解决方案1】:

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

  1. 覆盖onPrepareDialog(..) 重置它的状态
  2. 在再次显示之前致电removeDialog(..)
  3. 自己管理对话框,手动调用show()dismiss()

我通常为经常使用的Dialogs 选择#1,为稀有的@s 选择#3。

【讨论】:

    【解决方案2】:

    我通常使用 onCreateDialog() 加上 onPrepareDialog() 来管理对话框。

    From dev guide on android developers:

    定义 onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回调方法的最佳方法是使用 switch 语句检查传递给方法的 id 参数。每个案例都应检查唯一的对话框 ID,然后创建和定义相应的对话框。

    第一次创建对话框时调用一次onCreateDialog()方法;将初始化对话框的代码放在这里。

    每次显示对话框时都会调用onPrepareDialog() 方法。

    它提供了一个准备的机会 托管对话框之前 显示。如果需要,请覆盖它 根据 应用状态

    当必须关闭对话框时,您可以:

    如果你使用 onCreateDialog(int) 管理对话框的状态 (如前所述 部分),然后每次对话 被解雇,Dialog的状态 对象由 Activity 保留。如果 你决定不再 需要这个对象或者它很重要 状态被清除,那么你 应该调用 removeDialog(int)。这 将删除任何内部引用 对象,如果对话框是 显示,它将关闭它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多